2016-11-14 2 views
0

Извините за возможное запутанное название. Я новичок в JSON, и я работаю над веб-приложением с помощью программного обеспечения, которое взаимодействует с API. У меня есть контроль над обоими.Deserialize JSON для массива объектов, а не одного списка объектов

Моим приложениям необходимо перечислить список «Клиенты» и их «Проекты». В настоящее время она возвращает следующее:

{ 
    "clients": [ 
    { 
     "client_id": "1", 
     "client_name": "Client1", 
     "projects": [ 
     { 
      "client_project_id": "1", 
      "client_project_title": "WidgetsA", 
      "client_project_client": "1", 
      "client_project_status": "1" 
     }, 
     { 
      "client_project_id": "11", 
      "client_project_title": "WidgetsB", 
      "client_project_client": "1", 
      "client_project_status": "1" 
     } 
     ] 
    }, 
    { 
     "client_id": "11", 
     "client_name": "Client11", 
     "projects": [ 
     { 
      "client_project_id": "31", 
      "client_project_title": "Install", 
      "client_project_client": "11", 
      "client_project_status": "1" 
     } 
     ] 
    }, 
    { 
     "client_id": "21", 
     "client_name": "Client21", 
     "projects": [ 
     { 
      "client_project_id": "61", 
      "client_project_title": "Marketing", 
      "client_project_client": "21", 
      "client_project_status": "1" 
     } 
     ] 
    }, 
    { 
     "client_id": "31", 
     "client_name": "Client31", 
     "projects": [ 
     { 
      "client_project_id": "71", 
      "client_project_title": "Fire Everyone", 
      "client_project_client": "31", 
      "client_project_status": "1" 
     }, 
     { 
      "client_project_id": "81", 
      "client_project_title": "Buy A Company", 
      "client_project_client": "31", 
      "client_project_status": "1" 
     } 
     ] 
    } 
    ] 
} 

Я десериализация это достаточно легко объект, используя следующий код: Json.NET

MyObject result = JsonConvert.DeserializeObject<MyObject>(response); 

Однако, это работает только, если мои объекты выглядят так:

[Serializable, JsonObject] 
    internal class MyObject 
    { 
     [JsonProperty("clients")] 
     internal List<ClientObject> ClientList = new List<ClientList>(); 
    } 


internal class ClientObject 
    { 

     [JsonProperty("client_id")]internal string ClientID { get; set; } 

     [JsonProperty("client_name")] internal string ClientName { get; set; } 

     [JsonProperty("projects")] internal List<ProjectObject> ProjectList = new List<ProjectObject>(); 
    } 

(NB: Я изменил имена многих свойств и объектов для обеспечения конфиденциальности, поэтому приносим извинения за любые ошибки, добавлены)

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

List<ClientObject> result = JsonConvert.DeserializeObject<List<ClientObject>>(response); 

Но независимо от того, как я форматировать ответ JSON, JSON.NET выдает ошибку о том, что JSON не является массивом. Может ли кто-нибудь посоветовать, где я ошибаюсь, или что я недопонимаю?

+0

строки JSON не является массивом. –

+0

Ваш формат json является «объектным» форматом - '{" clientList ": [{client1properties}, {client2properties}]}'. Вам нужно изменить, чтобы возвращенный json был форматом коллекции '[{client1properties}, {client2properties}]' – Fabio

ответ

1

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

Вы можете использовать JSON Я предполагаю:

[ 
    { 
     "client_id": "1",  
    }, 
    { 
     "client_id": "2",  
    } 
] 

А если серьезно, это не больно, чтобы иметь надлежащий объект ответа, который содержит массив внутри. Я бы предпочел нам это.

+0

Есть ли какие-либо конкретные плюсы/минусы в любом случае? – Dan

+0

Нет, не думаю. Это всего лишь вопрос стиля, я думаю, я предпочитаю более явные (например, вы можете иметь имя, то есть «клиенты» в вашем случае) –

4

Как уже упоминалось, ваш JSON является объектом, а не массивом, поэтому его нельзя десериализовать непосредственно в список.

Но вы все еще можете использовать LINQ to JSON, чтобы получить список клиентов из JSON:

string json = @"..."; 
JObject data = JObject.Parse(json); 
List<ClientObject> clients = data["clients"].Select(c => c.ToObject<ClientObject>()).ToList();