我想反序列化一个从Web服务获得的JSON字符串。我的问题是,反序列化的对象类数组(类型为Result)总是有0个项....
但是webservice返回正确的字符串。 所以我认为失败发生在我如何反序列化字符串/流的方式。
任何想法都是我的错?
//JSON result string:
{"Results":
[{"Result":{
"Name":"Rechnung2",
"Date1":"2012-10-05",
"Item1":"50",
"Item2":"10",
"CompanyName":"Contoso",
"Description":"My description"}}]
}
[DataContract]
public class Result
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Date1 { get; set; }
[DataMember]
public string Item1 { get; set; }
[DataMember]
public string Item2 { get; set; }
[DataMember]
public string CompanyName { get; set; }
[DataMember]
public string Description { get; set; }
}
public async void GetjsonStream()
{
HttpClient client = new HttpClient();
string url = "http://localhost/test/api.php?format=json&key=12345";
HttpResponseMessage response = await client.GetAsync(url);
//ReadAsStringAsync() works fine, so I think ReadAsStreamAsync() works also fine
var str = await response.Content.ReadAsStreamAsync();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Result[]));
//Result has always 0 items
Result[] res = (Result[])ser.ReadObject(str);
}
答案 0 :(得分:3)
我自己没有使用DataContractJsonSerializer
,所以这可能不是最佳方法 - 但我怀疑问题是JSON代表“包含结果集合的对象“ - 不是”结果的集合“。
除了现有代码外,请尝试此操作:
[DataContract]
public class ResultCollection
{
[DataMember]
public Result[] Results { get; set; }
}
...
var ser = new DataContractJsonSerializer(typeof(ResultCollection));
var collection = (ResultCollection)ser.ReadObject(str);
var results = collection.Results;
如果有帮助,您也可以将Results
的类型更改为List<Result>
。
(我刚试过上面的代码,它给了我正确的结果,所以看起来这至少是沿着正确的方向......)