JSON对象引发null响应,但它不是null

时间:2019-10-26 10:53:22

标签: c# asp.net json

试图使用JavaScriptSerializer().Deserialize解析JSON对象,但在foreach (var item in getRoute.results)的{​​{1}}处抛出空错误

问题是,当我通过打印出其内容调试Route getRoute = new JavaScriptSerializer().Deserialize<Route>(strresulttest);时,我能够看到预期的JSON输出,如下所示https://codeshare.io/5vM6X4

解析JSON的代码:

strresulttest

预期的JSON输出(在 public class Route { public List<GetRoute> results { get; set; } } public class GetRoute { public string status_message { get; set; } public string viaRoute { get; set; } public string subtitle { get; set; } public int totalTime { get; set; } public int totalDistance { get; set; } } private void GetInstructions() { //GET METHOD for route query string strurltest = String.Format("https://developers.onemap.sg/privateapi/routingsvc/route?start="+ startLat+","+ startLon +"&end="+ destinationLat +","+ destinationLon+"&"+ "routeType="+ transportType + "&token="+token); WebRequest requestObjGet = WebRequest.Create(strurltest); requestObjGet.Method = "GET"; HttpWebResponse responseObjGet = null; responseObjGet = (HttpWebResponse)requestObjGet.GetResponse(); string strresulttest = null; using (Stream stream = responseObjGet.GetResponseStream()) { StreamReader sr = new StreamReader(stream); strresulttest = sr.ReadToEnd(); //reminder: remove after prod. GET is working. System.Diagnostics.Debug.WriteLine(strresulttest); sr.Close(); } //display search recommendations Route getRoute = new JavaScriptSerializer().Deserialize<Route>(strresulttest); foreach (var item in getRoute.results) { //reminder: remove after prod. System.Diagnostics.Debug.WriteLine("Route via: " + item.viaRoute + "\n"); System.Diagnostics.Debug.WriteLine("Description: " + item.subtitle + "\n"); } } 上显示):

System.Diagnostics.Debug.WriteLine(strresulttest);

1 个答案:

答案 0 :(得分:0)

您在results中得到的是空值,因为要反序列化为的类结构与JSON不匹配。您在问题中链接的JSON与此类结构相对应:

public class Route
{
    public string status_message { get; set; }
    public string route_geometry { get; set; }
    public int status { get; set; }
    public List<List<object>> route_instructions { get; set; }
    public List<string> route_name { get; set; }
    public RouteSummary route_summary { get; set; }
    public string viaRoute { get; set; }
    public string subtitle { get; set; }
    public Phyroute phyroute { get; set; }
}

public class RouteSummary
{
    public string start_point { get; set; }
    public string end_point { get; set; }
    public int total_time { get; set; }
    public int total_distance { get; set; }
}

public class Phyroute
{
    public string status_message { get; set; }
    public string route_geometry { get; set; }
    public int status { get; set; }
    public List<List<object>> route_instructions { get; set; }
    public List<string> route_name { get; set; }
    public RouteSummary route_summary { get; set; }
    public string viaRoute { get; set; }
    public string subtitle { get; set; }
}

您可以像这样反序列化并获得viaRoutesubtitle

Route route = new JavaScriptSerializer().Deserialize<Route>(strresulttest);
System.Diagnostics.Debug.WriteLine("Route via: " + route.viaRoute);
System.Diagnostics.Debug.WriteLine("Description: " + route.subtitle);