4

解析する必要がある次の JSON 形式のデータがあります。

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

json.net を使用して、次の出力を取得したいと考えています。

30 E タウン – ETP

81 ジョンソン – 天文台

以下のコードを使用すると、次の誤った出力が得られます。

30 E タウン – ETP

81 E タウン – ETP

方向配列アイテムを対応する 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;
        }
4

2 に答える 2

5

@Compentient_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にアクセスしてください。

于 2013-07-05T17:32:23.817 に答える
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"];
于 2013-07-05T17:22:44.837 に答える