1

我想反序列化从 Web 服务获得的 JSON 字符串。我的问题是,反序列化的对象类数组(Result 类型)中始终包含 0 个项目....

但网络服务返回正确的字符串。所以我认为失败发生在我反序列化字符串/流的方式上。

有什么想法是我的错吗?

//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);
    }
4

1 回答 1

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;

如果有帮助,您也可以将类型更改ResultsList<Result>

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

于 2012-05-05T08:11:54.047 回答