2012-05-05 4 views
1

Я хотел бы десериализовать строку JSON, которую я получаю из webservice. Моя проблема заключается в том, что массив десериализованного класса объектов (типа Result) всегда содержит 0 элементов.Metro App - deserialize JSON String

Но 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); 
    } 

ответ

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> тоже, если это полезно.

(я только что попробовал код, указанный выше, и он дал мне правильный результат, так это выглядит, по крайней мере в правильном направлении ...)

+0

Спасибо Джон. С небольшим изменением кода он работает хорошо. Большое спасибо :-). Кстати: я читал твою книгу, хорошие объяснения и статьи;) – user1011394

Смежные вопросы