Metro App - 反序列化JSON字符串

时间:2012-05-05 08:06:57

标签: c# json

我想反序列化一个从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);
    }

1 个答案:

答案 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>

(我刚试过上面的代码,它给了我正确的结果,所以看起来这至少是沿着正确的方向......)