2012-02-11 26 views
1

Json.Netを使用して次のJSONを.NETオブジェクトに逆シリアル化しようとすると、意図した通りに動作しません。通常、デシリアライズは大きな問題ではありませんが、次のJSONの構造は単純ではありません。JsonObjectsから.NETオブジェクトへの逆シリアル化

JSON:

{ 
    "33": { 
     "0": { 
      "StopName": "JFK Blvd & 15th St", 
      "Route": "33", 
      "date": "11:24p", 
      "day": "Fri", 
      "Direction": "1", 
      "DateCalender": "02/10/12 11:24 pm" 
     }, 
     "3": { 
      "StopName": "JFK Blvd & 15th St", 
      "Route": "33", 
      "date": "11:52p", 
      "day": "Fri", 
      "Direction": "1", 
      "DateCalender": "02/10/12 11:52 pm" 
     } 
    }, 
    "32": { 
     "1": { 
      "StopName": "JFK Blvd & 15th St", 
      "Route": "32", 
      "date": "11:30p", 
      "day": "Fri", 
      "Direction": "1", 
      "DateCalender": "02/10/12 11:30 pm" 
     } 
    }, 
    "17": { 
     "2": { 
      "StopName": "JFK Blvd & 15th St", 
      "Route": "17", 
      "date": "11:38p", 
      "day": "Fri", 
      "Direction": "1", 
      "DateCalender": "02/10/12 11:38 pm" 
     } 
    } 
} 

ルート番号を示す "33"、 "32"、 "17" からの合併症をもたらします。これらの数値は、結果セット内のルートが変更されると変更されます。

カスタムJSONコンバータを作成する必要があるとは思いますが、このタスクを実行する際に明確な情報が見つかりません(プロパティ名が動的な問題がないようです) 。

私はJSONにJSON.NETのLINQを使用することも試みていますが、JSONアクセスするには、次のようなコードを使用する必要があるため、これは現実的ではありません。私は現実的な考えを持っていないので

JObject o = JObject.Parse(e.Result); 
o["33"]; 

を手前にあるプロパティ名は、私はこのオブジェクトを容易に横断することはできません。

+0

使用している.NETのバージョンは? –

答えて

3

あなたのJSONフォーマットは:

{ 
    "33": { <-- This is MainRoute number 
     "0": { <-- This is SubRoute number and below are SubRoute properties 
      "StopName": "JFK Blvd & 15th St", 
      "Route": "33",       
      "date": "11:24p",     
      "day": "Fri", 
      "Direction": "1", 
      "DateCalender": "02/10/12 11:24 pm" 
     }, 
    .... 
} 

あなたのJSONデータを解析するJObjectを使用することができます。ここでは

public class MainRoute { 
     public int RouteNumber { get; set; } 
     public IList<SubRoute> SubRoutes { get; set; } 

     public MainRoute() 
     { 
       SubRoutes = new List<SubRoute>(); 
     } 
} 

public class SubRoute { 
     public int RouteNumber { get; set; } 
     public string StopName { get; set; } 
     public int Route { get; set; } 

     [JsonProperty("date")] 
     public string Date { get; set; } 

     [JsonProperty("day")] 
     public string Day { get; set; } 
     public int Direction { get; set; } 

     [JsonProperty("DateCalender")] 
     public string DateCalendar { get; set; } 
} 

class Program { 
     static void Main(string[] args) 
     { 
       string jsonString = FetchJsonData(); 
       var routes = ParseRouteJsonString(jsonString); 
     } 

     static IEnumerable<MainRoute> ParseRouteJsonString(string jsonString) 
     { 
       JObject jsonObject = JObject.Parse(jsonString); 
       foreach (KeyValuePair<string, JToken> pair in jsonObject) { 
         var mainRoute = new MainRoute() { 
           RouteNumber = Int32.Parse(pair.Key) // Get main route number. 
         }; 

         foreach (JProperty property in pair.Value) { 
           var subRoute = property.Value.ToObject<SubRoute>(); 
           subRoute.RouteNumber = Int32.Parse(property.Name); // Get sub route number. 
           mainRoute.SubRoutes.Add(subRoute); 
         } 

         yield return mainRoute; 
       } 
     } 
} 
3

はJSONにLINQを使用してルートを反復処理する方法の小さなサンプルです:

var main = JObject.Parse(json); 
foreach (var mainRoute in main.Properties()) 
{ 
    Console.WriteLine(mainRoute.Name); //33, 32, ... 
    foreach (var subRoute in mainRoute.Values<JObject>().SelectMany(x => x.Properties())) 
    { 
     Console.WriteLine(" " + subRoute.Name); //0, 3, ... 
     var routeData = subRoute.Value as JObject; 
     foreach (var dataItem in routeData.Properties()) 
     { 
      Console.WriteLine(string.Format(" {0} = {1}", dataItem.Name, dataItem.Value.Value<string>())); 
     } 
    } 
} 
関連する問題