2017-01-03 8 views
0

У меня есть следующие JSON:Json десериализации обнулить с помощью Newtosoft JSon

{ 
    "cuisines": [ 
    { 
     "cuisine": { 
     "cuisine_id": 152, 
     "cuisine_name": "African" 
     } 
    }, 
    { 
     "cuisine": { 
     "cuisine_id": 1, 
     "cuisine_name": "American" 
     } 
    }, 
    { 
     "cuisine": { 
     "cuisine_id": 4, 
     "cuisine_name": "Arabian" 
     } 
    }, 
    { 
     "cuisine": { 
     "cuisine_id": 151, 
     "cuisine_name": "Argentine" 
     } 
    } 
    ] 
} 

Im используя RestSharp, чтобы получить данные и отправить его в Json.NET:

JsonConvert.DeserializeObject<Cuisines>(content) 

И я использую следующие классы:

public class Cuisine 
    { 
     [JsonProperty("cuisine_id")] 
     public string cuisine_id { get; set; } 
     [JsonProperty("cuisine_name")] 
     public string cuisine_name { get; set; } 
    } 

    public class Cuisines 
    { 
     [JsonProperty("cuisines")] 
     public List<Cuisine> AllCuisines { get; set; } 
    } 

Что странно это, возвращение данных устанавливающие 81 кухни объекты по моей просьбе, но весь C uisine info - null.

+0

Престола [json2csharp.com] (http://json2csharp.com) –

+1

@MalteR Visual Studio сделает это для вас – Plutonix

+0

@Plutonix не нужен ли вам веб Плагин Essentials для этого? –

ответ

3

Вы модель должна еще один класс. Так оно и должно быть

public class Cuisine 
{ 
    [JsonProperty("cuisine_id")] 
    public string cuisine_id { get; set; } 
    [JsonProperty("cuisine_name")] 
    public string cuisine_name { get; set; } 
} 

public class CuisineWrapper 
{ 
    public Cuisine cuisine { get; set; } 
} 

public class Cuisines 
{ 
    [JsonProperty("cuisines")] 
    public List<CuisineWrapper> AllCuisines { get; set; } 
} 
-1

Ваш JSON вложен больше, чем ваша структура класса. Если вы можете изменить JSON на форму:

"cuisines": [ 
    { 
     "cuisine_id": 152, 
     "cuisine_name": "African" 
    }, 
    { 
     "cuisine_id": 1, 
     "cuisine_name": "American" 
    }, 
    .. etc 

Тогда это будет соответствовать вашей структуре классов.

В качестве альтернативы, изменить структуру класса в соответствии с JSON:

public class Cuisine 
{ 
    [JsonProperty("cuisine")] 
    public CuisineData data { get; set; } 
} 

public class CuisineData 
{ 
    [JsonProperty("cuisine_id")] 
    public string cuisine_id { get; set; } 
    [JsonProperty("cuisine_name")] 
    public string cuisine_name { get; set; } 
} 

public class Cuisines 
{ 
    [JsonProperty("cuisines")] 
    public List<Cuisine> AllCuisines { get; set; } 
} 
+0

Я не могу изменить json. Его ответ от API –

+0

См. Мое редактирование. Кроме того, вы не указали, контролировали ли вы web-api или нет, поэтому было разумным предположением. – Blorgbeard

0

Вы на самом деле есть 3 объекта - корневой объект, который содержит свойство с именем cuisines, который представляет собой набор Cuisine. При вставке вашего JSON в качестве классов в визуальной студии Вы получаете следующую структуру (которую вы, вероятно, хотите переименовать некоторые вещи и список-римент массива)

public class Rootobject 
{ 
    public Cuisine[] cuisines { get; set; } 
} 

public class Cuisine 
{ 
    public Cuisine1 cuisine { get; set; } 
} 

public class Cuisine1 
{ 
    public int cuisine_id { get; set; } 
    public string cuisine_name { get; set; } 
} 
1

Ваших классы определения не соответствует условию JSON. массив верхнего уровня содержит объекты с одного объекта (объекта) cuisine, например, так:

"cuisine": { 
    "cuisine_id": 152, 
    "cuisine_name": "African" 
} 

, где в качестве C# List<Cuisine> содержит объекты, непосредственно подвергая cuisine_id и cuisine_name. Если вы не можете изменить JSON, украсить class Cuisine с JsonObjectAttribute

+0

Вы должны добавить пример использования '[JsonObject]', это похоже на лучшее решение, чем на добавление класса-оболочки. – Blorgbeard

+0

[JSONObject ("кухня")] общественного класса Кухня { \t ..... } – Sherlock

+0

Я имел в виду, [править] это в ваш ответ :) – Blorgbeard