2016-05-23 6 views
2

私はJSON.netに精通しており、基本構造(1人の子供まで)でJSONを逆シリアル化できます。私は現在、Netatmo APIから返されたJSONを逆シリアル化しています。 JSONの構造は私のために複雑です。以下は、JSONの基本構造です。子どもと内子のJSONを逆シリアル化する

動的値1と動的値2は、idごとに変更される値を表します。完全なJSONは

{ 
    "body": [{ 
     "_id": "70:ee:50:02:b4:8c", 
     "place": { 
      "location": [-35.174779762001, -5.8918476117544], 
      "altitude": 52, 
      "timezone": "America\/Fortaleza" 
     }, 
     "mark": 0, 
     "measures": { 
      "02:00:00:02:ba:2c": { 
       "res": { 
        "1464014579": [16.7, 77] 
       }, 
       "type": ["temperature", "humidity"] 
      }, 
      "70:ee:50:02:b4:8c": { 
       "res": { 
        "1464014622": [1018.1] 
       }, 
       "type": ["pressure"] 
      } 
     }, 
     "modules": ["02:00:00:02:ba:2c"] 
    }, { 
     "_id": "70:ee:50:12:40:cc", 
     "place": { 
      "location": [-16.074257294385, 11.135715243973], 
      "altitude": 14, 
      "timezone": "Africa\/Bissau" 
     }, 
     "mark": 14, 
     "measures": { 
      "02:00:00:06:7b:c8": { 
       "res": { 
        "1464015073": [26.6, 78] 
       }, 
       "type": ["temperature", "humidity"] 
      }, 
      "70:ee:50:12:40:cc": { 
       "res": { 
        "1464015117": [997] 
       }, 
       "type": ["pressure"] 
      } 
     }, 
     "modules": ["02:00:00:06:7b:c8"] 
    }], 
    "status": "ok", 
    "time_exec": 0.010364055633545, 
    "time_server": 1464015560 
} 

私はこのJSONの複雑な構造を見ることで混乱しています、以下のとおりです。 JSONの単一レベルのために、私は過去にこのコード、

IList<lstJsonAttributes> lstSearchResults = new List<lstJsonAttributes>(); 
foreach (JToken objResult in objResults) { 
    lstJsonAttributes objSearchResult = JsonConvert.DeserializeObject<lstJsonAttributes>(objResult.ToString()); 
    lstSearchResults.Add(objSearchResult); 
} 

を使用していた。しかしこれほど多くの子供のために私は、オブジェクトクラスを作成する方法を理解するためには至っていません。どんな指導も高く評価されます。

更新: これはこれまで私が達成したことです。私は以下のようにメインクラスを作成した

public class PublicDataClass 
{ 
    public string _id { get; set; } 
    public PublicData_Place place { get; set; } 
    public string mark { get; set; } 
    public List<string> modules { get; set; } 
} 

と「場所」のクラスは、

public class PublicData_Place 
{ 
    public List<string> location { get; set; } 
    public string altitude { get; set; } 
    public string timezone { get; set; } 
} 

は、その後、私は次のコード行でオブジェクトをデシリアライズしている、次の通りであります

var obj = JsonConvert.DeserializeObject<List<PublicDataClass>>(jsonString); 

もう少し複雑な「測定値」を除くすべてのデータを正常に取得できるようになりました。

答えて

1

を使用すると、任意のプロパティ名を持ち、固定値のスキーマを持つJSONオブジェクトを適切なタイプTDictionary<string, T>としてデシリアライズすることができます。詳細については、Deserialize a Dictionaryを参照してください。したがって、"measures""res"オブジェクトは辞書としてモデル化できます。

List<PublicDataClass>をカプセル化するにはルートオブジェクトが必要です。ルートJSONコンテナは次のようなオブジェクトです:{ "body": [{ ... }] }。次のように

したがって、あなたのクラスを定義することができます。

public class RootObject 
{ 
    public List<PublicDataClass> body { get; set; } 
    public string status { get; set; } 
    public double time_exec { get; set; } 
    public int time_server { get; set; } 
} 

public class PublicDataClass 
{ 
    public string _id { get; set; } 
    public PublicData_Place place { get; set; } 
    public int mark { get; set; } 
    public List<string> modules { get; set; } 
    public Dictionary<string, Measure> measures { get; set; } 
} 

public class PublicData_Place 
{ 
    public List<double> location { get; set; } // Changed from string to double 
    public double altitude { get; set; } // Changed from string to double 
    public string timezone { get; set; } 
} 

public class Measure 
{ 
    public Measure() 
    { 
     this.Results = new Dictionary<string, List<double>>(); 
     this.Types = new List<string>(); 
    } 

    [JsonProperty("res")] 
    public Dictionary<string, List<double>> Results { get; set; } 

    [JsonProperty("type")] 
    public List<string> Types { get; set; } 
} 

は、その後、あなたの答えとどのようにあなたがそれを説明してきてくれてありがとうの

var root = JsonConvert.DeserializeObject<RootObject>(jsonString); 
var obj = root.body; 
+0

バンドルを行います。私はこの時点でゆっくりと自分に到達していました。私はhttp://json2csharp.com/を使ってJSONをC#オブジェクトに変換しました。それは測定のためのオブジェクトを正常に作成しませんでしたが、SOの別の投稿を参照し、JSON全体を動的オブジェクトに変換しました。それはすべてを作成し、すべてのデータを設定しました。 QuickWatchウィンドウのオブジェクトを調べて、Measuresのネストされた子オブジェクトがDictionaryとして作成されていることを確認しました。カスタムタイプは、ネストされた動的オブジェクトで作業するほうがはるかに簡単です。 –

+0

私はそれをテストしたところ、問題なく動作しました。もう一度ありがとう。 –

1

私はXMLを使って数年前からJSON構造に変更しましたが、私はちょっと混乱しました。いつも私はこのウェブサイトをどのようにオブジェクトが見えるか見たいです。jsoneditoronlineコピー&ペーストあなたのJSONをクリックして矢印をクリックしてオブジェクトを解析すると、JSONの構造に慣れるまで役立つことを願っています。

関連する問題