使用json.NET和C#解析JSON数组

4

我有一些数据需要以以下JSON格式解析:

{
"status":0,
"timestamp":"8:20pm",
"routes":[
    {
        "directions":[
            "E Towne",
            "ETP"
        ],
        "routeID":"30"
    },
    {
        "directions":[
            "Johnson",
            "Observatory"
        ],
        "routeID":"81"
    }
]
}

使用 json.net,我想获得以下输出结果:

30 E Towne – ETP

81 Johnson – Observatory

但是,使用下面的代码,我得到了以下错误的输出结果:

30 E Towne – ETP

81 E Towne – ETP

我该如何将 directions 数组项写入相应的 routeID 项?我的代码:
public class Route
        {
            public string routeID { get; set; }
            public string directions { get; set; }  
        }

private void routeClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
        {
            string jsonResults_routes = e.Result;
            JObject routeData = JObject.Parse(jsonResults_routes);

            JArray routeIdArray = (JArray)routeData["routes"];
            JArray routeDirections = (JArray)routeData["routes"][0]["directions"];

            List<Route> l = new List<Route>();

            for (int i = 0; i < routeIdArray.Count; i++)
            {
                Route BusRoutes = new Route();

                JObject routeIDarrayObject = (JObject)routeIdArray[i];
                BusRoutes.routeID = (string)routeIDarrayObject["routeID"];

                string sep = " - ";
                string bothDirections = String.Join(sep, routeDirections);

                List<string> sc = new List<string>();
                string[] direction = new string[]{bothDirections};
                sc.AddRange(direction);

                foreach (string direx in sc)
                {
                    BusRoutes.directions = direx; 
                }

                l.Add(BusRoutes);

            }
            var newList = l.OrderBy(x => x.routeID).ToList();
            lbRoutesData.ItemsSource = newList;
        }
2个回答

5

@competent_tech的分析是正确的。如果我可以提出建议,我认为如果您使用实际对象进行工作,会更加自然。例如:

public class RouteInfo
{
    public List<string> Directions { get; set; }
    public string RouteID { get; set; }
}

public class RouteData
{
    public int Status { get; set; }
    public string Timestamp { get; set; }
    public List<RouteInfo> Routes { get; set; }
}

在你的方法中:
var routeData = JsonConvert.DeserializeObject<RouteData>(e.Result);
return routeData.Routes
                .Select(r => new Route
                    {
                        routeId = r.RouteID,
                        directions = String.Join(" - ", r.Directions)
                    })
                .OrderBy(r =­> r.routeId)
                .ToList();

或者以更自然的方式使用其他方法操纵您的类型对象。

编辑:如果想要通过JSON字符串生成类,可以前往json2csharp网站。


在你的方法示例中,第3行中,“new Route”应该是“new RouteInfo”吗?此外,“routeId”和“directions”定义在哪里? - IanMitz
1
不行,因为RouteInfo是Json对象的类表示,而Route则代表了预期的返回类型(请参见原始问题,它在最后一个代码块中)。这也是routeIddirections被定义的地方。我只是重用了你的类。 - Simon Belanger
好的。所以,我的最终代码中有3个公共类('Route'、'RouteInfo'、'RouteData')?那么我该如何将你的示例方法与我的代码联系起来,即将数据传递给我的'var newlist'? - IanMitz
感谢您的帮助,很抱歉确认答案的延迟。我刚回来继续处理这个项目。 - IanMitz

2
这是因为你的routeDirections在特别请求数组中的第一个元素:
JArray routeDirections = (JArray)routeData["routes"][0]["directions"];

你需要将这个逻辑移到循环内部,并使用当前循环索引器:
for (int i = 0; i < routeIdArray.Count; i++)
{
    Route BusRoutes = new Route();

    JObject routeIDarrayObject = (JObject)routeIdArray[i];
    BusRoutes.routeID = (string)routeIDarrayObject["routeID"];

    JArray routeDirections = routeIDarrayObject["directions"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接