2017-01-25 5 views
0

Я пытаюсь хранить данные JSON в классе. Я мог бы десериализовать мою другую строку JSON в класс: var ser = JsonConvert.DeserializeObject<ClsResult>(myJSON);, прежде чем я застрял с массивом.Deserialize array в JSON в класс/объект

{ 
     \"Test\": [{ 
     \"FirstBool\":1, 
     \"aString\":\"hello\" 
     }] 
    } 

Это мой класс для JSON:

public class Test 
{ 
    [JsonProperty("FirstBool")] 
    public bool FirstBool { get; set; } 

    [JsonProperty("aString")] 
    public string aString { get; set; } 
}  

public class ResultObject 
{ 
     [JsonProperty("Test")] 
     public List<Test> Test { get; set; } 
} 

Как я десериализации мой не-массив JSON:

var ser = JsonConvert.DeserializeObject<ResultObject>(myJSON); 

Какие изменения мне нужно сделать, чтобы заставить его работать снова ?

+0

Вы уверены, что 'FirstBool' должен быть' bool'? Это 'int' в JSON. – Equalsk

ответ

1

Edited ответ

Ваш JSON строку, как я заметил позже, содержит объект с именем Test, которая в основном массив object с (object[]).

Как вы можете видеть из JSon строки:

{ "Тест": [{ "FirstBool": 1, "aString": "привет" }] }

[ означает, что объект JSON начинается тип массива и ] означает, что объект JSON закончился тип массива.

{ означает, что объект json начинает тип объекта, а } означает, что объект json завершил тип объекта.

Что в вашем случае потребуется сделать вид обычая десериализатор с использованием существующих методов из Newtonsoft.Json библиотеки.

Пример для Test объекта может быть:

JObject obj = JObject.Parse(jsonString); 
// now your obj contains field named "Test" that is of type object[] 
// to retrieve informations you have to select "Test" token 
JToken testToken = obj.SelectToken("Test"); 
// your token contains now something like " [{ "FirstBool" : 1, "aString" : "hello" }]" 
// which basically is an array 
// meaning that you have to iterate through this 
foreach(var child in token.Children()) 
{ 
    // and convert it to a Test object 
    Test test = JsonConvert.DeserializeObject<Test>(child.ToString()); 
    // test now is fully deserialized object 
} 
+0

По рекомендации, должен ли я изменить 'public List Test {get; задавать; } '** to **' public Test Test {get; задавать; } 'также? – user7399041

+0

@ user7399041 Извините, мой плохой. Я не читал вашу примерную строку json. Теперь это должно работать по назначению. –

+0

Большое спасибо за хорошо объясненный отредактированный ответ :) Работает очень хорошо. – user7399041

0

Deserialize его в виде списка:

JsonConvert.DeserializeObject<List<Test>>(json); 

... вместо объекта оболочки.

+0

Должен ли я изменить 'public List Test {get; задавать; } '** to **' public Test Test {get; задавать; } 'также? – user7399041

+0

Вам совсем не нужен ResultObject! Это просто обертка прямо сейчас, пусть JsonConvert обрабатывает ее для вас. – galister