4

次のような JSON データがあります。

{
   "position":[
      {
         "top":[
            42,
            12
         ]
      },
      {
         "middle":[
            10,
            15
         ]
      },
      {
         "bottom":[
            5,
            201
         ]
      },
      {
         "axis":[
            {
               "X":[
                  901,
                  51,
                  67
               ]
            },
            {
               "Y":[
                  1474186,
                  561647
               ]
            },
            {
               "Z":[
                  911,
                  1296501
               ]
            },
            15,
            20
         ]
      }
   ],
   "validated":true,
   "metadata":{
      "uri":"/data/complex/",
      "session":[
         1818,
         14
      ],
      "private":false
   },
   "vists":0,
   "ok":true,
   "data":{
      "10":{
         "title":"Alpha",
         "author":"Justin X. Ample",
         "cover":"/f48hf58.tiff"
      },
      "901":{
         "title":"Tau",
         "author":"Felina Blank",
         "cover":"/45trthrref.tiff"
      }
   },
   "live":null
}

このデータから、次のようなリストを表示したいと思います。

Alpha, Justin X. Ample
Tau, Felina Blank

キー (私の例では 10 と 901) は予測できないことに注意してください。したがって、「データ」構造を表すオブジェクトを何らかの形で作成し、それを繰り返し処理して、各エントリのタイトルと作成者を取得したいと考えています。

基本的な JSON 構造で、(JSON.NET を使用して) 次のようなもので成功しました。

public class Foo
    {
        public int bar { get; set; }
        public string baz { get; set; }
        public string quxx { get; set; }
    }

...

// json = {"bar": 1, "baz":"two", "quxx":"three"}
var result = await JsonConvert.DeserializeObjectAsync<Foo>(json);

return result.baz // "two"

しかし、複雑な構造で機能させるために何をする必要があるのか​​ わかりません。

4

2 に答える 2

6
var jObj = JsonConvert.DeserializeObject(json) as JObject;
var result = jObj["data"].Children()
                .Cast<JProperty>()
                .Select(x => new { 
                    Title = (string)x.Value["title"] ,
                    Author = (string)x.Value["author"],
                })
                .ToList();
于 2012-12-24T21:24:39.770 に答える
1

今までと同じように使えます。エンティティ クラスを次のように変更するだけです。

public class MyVeryVeryUsefulObject
{

    public Position[] position { get; set; }
    public string baz { get; set; }
    public string quxx { get; set; }
}

public class Position
{
    public Int32[] top;
    public Int32[] middle;
    public Int32[] bottom;
}

等々。コード内で JSON オブジェクトをエンティティ クラスとして表現するだけです。

少し前に便利なリンクを見つけました。これにより、この json 構造を実現する作業負荷が軽減される可能性があります。 http://json2csharp.com/

于 2012-12-24T22:16:17.827 に答える