2016-03-29 8 views
2

既存のJSONベースのWebサービスは、非常に面倒なJSONオブジェクトを返します。すべての有用なデータは、要素配列。私はそれらの行の各サブ要素にアクセスする必要があるJSON.netを使用しJSON.netを使用してオブジェクトに内部配列を非直列化する

{"rows":[[ 
    {"name":"John","time":"2016-03-20 01:00:00","id":"2","code":"1234"}, 
    {"name":"Sam","time":"2016-03-20 01:00:00","id":"24","code":"999"}, 
    {"name":"Paul","time":"2016-03-20 01:00:00","id":"12","code":"6512"} 
]]} 

が、私はこれを越えている場合反復処理するかどうかはわかりません。このような何か(私はうまくいけば何のタイプミス、それを匿名化しませんよ)私は具体的な型にデシリアライズするか、jsonオブジェクトから生データを読み取るだけですべきです。

データはメソッド内で集約されるため、それぞれの型の値はメソッド外で知る必要がありません。

常には、図のように要素の配列を含む1要素の配列にすることができます。

答えて

2

がうまく動作するはずですが、あなたはRootObjectを廃止したい場合は、することができますJson.NetのLINQ-to-JSON APIを使用してJSONを解析し、データを簡単な作業項目リストにまとめます。

public class Item 
{ 
    public string name { get; set; } 
    public DateTime time { get; set; } 
    public string id { get; set; } 
    public string code { get; set; } 
} 

次にあなたが項目のリストを取得するには、この操作を行うことができます:

List<Item> items = JObject.Parse(json)["rows"][0] 
          .Select(jt => jt.ToObject<Item>()) 
          .ToList(); 

フィドル:https://dotnetfiddle.net/FtB3Cu


をあなたはこのようなアイテムデータ用に定義されたクラスを持っていると仮定すると

クラスを宣言することを避けたい場合は、代わりに匿名の型を使用します

var items = JObject.Parse(json)["rows"][0] 
        .Select(jt => new 
        { 
         name = (string)jt["name"], 
         time = (DateTime)jt["time"], 
         id = (string)jt["id"], 
         code = (string)jt["code"] 
        }) 
        .ToList(); 

はフィドル:https://dotnetfiddle.net/0QXUzZ

+0

ありがとうBrian 。具体的な型の宣言を避けるために、これをさらにメソッドローカルの匿名型と組み合わせる方法はありますか?それとも、プライベートな内面クラスを持っているだけですか? –

+0

@ Mr.Boyはい、匿名の種類を使用できます。私は答えをどのように編集したのですか。あなたがそのルートに行くことを選択した場合、内部クラスでも動作するはずです。 –

+0

華麗な、多くのお礼 –

1

それは、あなたのルートオブジェクトはList<List<>>をシンプル含まれています:

あなたのオブジェクトは、次のようになります。ところで、このサイトを

string json = @"{'rows':[[ 
        {'name':'John','time':'2016-03-20 01:00:00','id':'2','code':'1234'}, 
        {'name':'Sam','time':'2016-03-20 01:00:00','id':'24','code':'999'}, 
        {'name':'Paul','time':'2016-03-20 01:00:00','id':'12','code':'6512'} 
       ]]}"; 

var rootObject = JsonConvert.DeserializeObject<RootObject>(json); 

public class InnerObject 
{ 
    public string name { get; set; } 
    public DateTime time { get; set; } 
    public string id { get; set; } 
    public string code { get; set; } 
} 

public class RootObject 
{ 
    public List<List<InnerObject>> rows { get; set; } 
} 

その後JSON.NETを使用json2csharpは、JSONからC#クラスを生成して、人生を楽にしてくれます:)

EDIT:

ます。また、動的に使用して、 `RootObjectからパーサを避けることができます:FALSのソリューション@

var rootObject = JsonConvert.DeserializeObject<dynamic>(json); 
rootObject.rows[0] <--- should have what you need 
+0

おかげEは、このようにコードを変更することができます。手動で文字列をハックすることなく 'RootObject'を必要としないようにすっきりした方法はありますか? e..gはJSON.net呼び出しから 'InnerObject'のリスト/リストを取得しますか? –

+0

@ Mr.BoyカスタムJsonCreationConverterを作成することができます。http://www.newtonsoft.com/json/help/html/DeserializeCustomCreationConverter.htm – Fals

+0

@ Mr.Boy上記の編集を参照してください、より動的に考えることができます。 – Fals