1

Webサービスから取得したJSON文字列を逆シリアル化したいのですが。私の問題は、(Result型の)逆シリアル化されたオブジェクトクラス配列には常に0個のアイテムが含まれていることです。

ただし、Webサービスは正しい文字列を返します。したがって、文字列/ストリームを逆シリアル化する方法で障害が発生すると思います。

私のせいは何ですか?

//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;

Results役立つ場合は、のタイプもに変更できる場合がありList<Result>ます。

(上記のコードを試したところ、正しい結果が得られたので、少なくともこれは正しい線に沿っているように見えます...)

于 2012-05-05T08:11:54.047 に答える