2014-02-19 2 views
11

Я пытаюсь прочитать мой результат JSON.Не удается десериализовать текущий массив JSON (например, [1,2,3])

Вот мой RootObject

public class RootObject 
{ 
public int id { get; set; } 
public bool is_default { get; set; } 
public string name { get; set; } 
public int quantity { get; set; } 
public string stock { get; set; } 
public string unit_cost { get; set; } 
} 

Вот мой результат JSON

[{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id": 4592, "is_default": false, "name": "Bundle", "quantity": 5, "stock": "100000.00", "unit_cost": "0"}] 

Вот мой код, чтобы прочитать результат

 public static RootObject GetItems(string user, string key, Int32 tid, Int32 pid) 
    { 
     // Customize URL according to geo location parameters 
     var url = string.Format(uniqueItemUrl, user, key, tid, pid); 

     // Syncronious Consumption 
     var syncClient = new WebClient(); 

     var content = syncClient.DownloadString(url); 

     return JsonConvert.DeserializeObject<RootObject>(content); 

    } 

Но я, имеющий проблема с эта ошибка:

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'avaris_cash_salepoint.BL.UniqueItemDataRootObject' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. Path '', line 1, position 1.

на этой линии: вернуть JsonConvert.DeserializeObject (содержание);

Помочь устранить эту ошибку?

+0

Что такое содержание 'вар Content', прежде чем она будет передана в к' DeserializeObject'? – Dayan

+0

содержание содержит результат json, @Dayan – Djama

+0

Как выглядит ваш JSON-пример выше? – Dayan

ответ

19

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что ваш JSON - это список объектов, когда он входит, и он напрямую не связан с вашим корневым классом.

var content будет выглядеть примерно так (я предполагаю):

[ 
    { 
    "id": 3636, 
    "is_default": true, 
    "name": "Unit", 
    "quantity": 1, 
    "stock": "100000.00", 
    "unit_cost": "0" 
    }, 
    { 
    "id": 4592, 
    "is_default": false, 
    "name": "Bundle", 
    "quantity": 5, 
    "stock": "100000.00", 
    "unit_cost": "0" 
    } 
] 

Примечание: использовать http://jsonviewer.stack.hu/ для форматирования JSON.

Так что, если вы выполните следующие действия, он должен работать:

public static List<RootObject> GetItems(string user, string key, Int32 tid, Int32 pid) 
    { 
     // Customize URL according to geo location parameters 
     var url = string.Format(uniqueItemUrl, user, key, tid, pid); 

     // Syncronious Consumption 
     var syncClient = new WebClient(); 

     var content = syncClient.DownloadString(url); 

     return JsonConvert.DeserializeObject<List<RootObject>>(content); 

    } 

Вам нужно будет затем итерацию, если вы не хотите, чтобы вернуть список RootObject.


Я пошел и проверил это в приложении консоли, отлично работал.

enter image description here

+0

Я пробовал и имею следующую ошибку: Не могу неявно преобразовать тип 'System.Collections.Generic.List в RootObject. – Djama

+0

И у 'content' есть JSON i, вышедший выше? – Dayan

+0

Да, в содержании есть json, который вы разместили выше. но я думаю, что что-то должно быть сделано в классе Rootobject – Djama

0

У вас есть массив, преобразовать его в объект, что-то вроде:

data: [{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id": 4592, "is_default": false, "name": "Bundle", "quantity": 5, "stock": "100000.00", "unit_cost": "0"}]

3

Это потому, что JSON вы получаете массив вашего RootObject класса, а не в одном экземпляре, изменить DeserialiseObject<RootObject> быть чем-то вроде DeserialiseObject<RootObject[]> (не проверено).

Вам необходимо либо сменить метод, чтобы вернуть коллекцию RootObject, либо выполнить дальнейшую обработку десериализованного объекта, чтобы вернуть один экземпляр.

Если вы посмотрите на отформатированную версию ответа вы предоставили:

[ 
    { 
     "id":3636, 
     "is_default":true, 
     "name":"Unit", 
     "quantity":1, 
     "stock":"100000.00", 
     "unit_cost":"0" 
    }, 
    { 
     "id":4592, 
     "is_default":false, 
     "name":"Bundle", 
     "quantity":5, 
     "stock":"100000.00", 
     "unit_cost":"0" 
    } 
] 

Вы можете увидеть два экземпляра там.

+0

экземпляр может быть более одного, с другими параметрами у меня есть один экземпляр или 3 04 четыре экземпляра. @Psytronic – Djama

2

Вы можете использовать это, чтобы решить вашу проблему:

private async void btn_Go_Click(object sender, RoutedEventArgs e) 
{ 
    HttpClient webClient = new HttpClient(); 
    Uri uri = new Uri("http://www.school-link.net/webservice/get_student/?id=" + txtVCode.Text); 
    HttpResponseMessage response = await webClient.GetAsync(uri); 
    var jsonString = await response.Content.ReadAsStringAsync(); 
    var _Data = JsonConvert.DeserializeObject <List<Student>>(jsonString); 
    foreach (Student Student in _Data) 
    { 
     tb1.Text = Student.student_name; 
    } 
} 
+0

Опишите идею этого кода. –

+0

Хорошее решение. JSON, который был возвращен, был списком, и этот код повторялся через список, чтобы извлечь элементы. Отлично! –

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