1

次のような HTTP リクエストから返された JSON 文字列を受信して​​います。

[
   {
  "size":590,
  "location":"California",
  "report":{
     "Bob":[
        null,
        "12.0.250.0",
        "20130228"
     ],
     "Mary":[
        null,
        "2013-02-28.01",
        "20130228"
     ],
     "John":[
        null,
        "12.00",
        "59123805"
     ]
  }
},
{
  "size":12348,
  "location":"Florida",
  "report":{
     "Misty":[
        null,
        "65492.592",
        "89216753"
     ],
     "Billy":[
        null,
        "789208.w9",
        "65320880"
     ],
     "John":[
        null,
        "89.8056",
        "75920889"
     ]
   }
 }
]

逆シリアル化しようとしているクラスは、次のように構成されています。

[DataContract]
public class DeserializedObject
{
    [DataMember(Name = "size")]
    public UInt64 Size { get; set; }

    [DataMember(Name = "location")]
    public string Location { get; set; }

    [DataMember(Name = "report")]
    public Dictionary<string, ReportData> Report { get; set; } 
}

[CollectionDataContract]
public class ReportData : List<object>
{
    public string a
    {
        get { return (string)this[0]; }
        set { this[0] = (string)value; }
    }

    public string b
    {
        get { return (string)this[1]; }
        set { this[1] = (string)value; }
    }

    public string c
    {
        get { return (string)this[2]; }
        set { this[2] = (string)value; }
    }
}

ただし、逆シリアル化しようとすると、レポートは常に空になります。

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<DeserializedObject>));
List<DeserializedObject> list = serializer.ReadObject(stream) as List<DeserializedObject>;

JSON応答の「レポート」部分を逆シリアル化する正しい方法は何ですか?

4

2 に答える 2

0

Json.NET を使用して、JSON 文字列を正常に逆シリアル化できました。文字列を逆シリアル化するために使用したクラスは次のようになります。

[DataContract]
public class DeserializedObject
{
    [DataMember(Name = "size")]
    public UInt64 Size { get; set; }

    [DataMember(Name = "location")]
    public string Location { get; set; }

    [DataMember(Name = "report")]
    public Dictionary<string, string[]> Report { get; set; } 
}

オブジェクトを逆シリアル化するために使用されるコードは次のようになります。

StreamReader reader = new StreamReader(stream);
List<DeserializedObject> instance = JsonConvert.DeserializeObject<List<DeserializedObject>>(reader.ReadToEnd());
于 2013-03-18T16:47:20.810 に答える
0

問題は、レポート クラスが正しく設定されていないことです。json.NET は、キー a、b、および c を探しています。それに加えて、辞書の値はオブジェクトではなく文字列配列です。ReportData オブジェクト。その不一致がエラーの原因です。

<string, string[]>代わりに、レポートはタイプの辞書である必要がありReportData、プロジェクトから削除する必要があると思います。これを行う場合、次のクラスを使用します (その DataContract は実際には必要ありません)。

  public class DeserializedObject
  {
      public UInt64 size { get; set; }

       public string location { get; set; }

       public Dictionary<string, string[]> report { get; set; } 
   }
于 2013-03-15T22:29:43.760 に答える