2014-11-25 4 views
0

Я использую JSON.Net для десериализации строки JSON. Строка JSON являетсяDeserialization of JSON.Net возвращает «null»

string testJson = @"{ 
        ""Fruits"": { 
         ""Apple"": { 
          ""color"": ""red"", 
          ""size"": ""round""        
         }, 
         ""Orange"": { 
          ""Properties"": { 
           ""color"": ""red"", 
           ""size"": ""round"" 
          } 
         } 
        } 
       }"; 

и мой код

public class Fruits 
{ 
    public Apple apple { get; set; } 
    public Orange orange { get; set; } 
} 

public class Apple 
{ 
    public string color { get; set; } 
    public string size { get; set; }    
} 

public class Orange 
{ 
    public Properties properties { get; set; } 
} 

public class Properties 
{ 
    public string color { get; set; } 
    public string size { get; set; } 
} 

Я пытаюсь Deserialize это с помощью следующего кода

Fruits result = JsonConvert.DeserializeObject<Fruits>(testJson); 

У меня есть проблема в моем результате что Фрукты с Apple и Orange имеет null вместо их свойств, цвета, размер.

+3

Проблема в том, что внешние наручники '{...}' соответствуют вашему типу 'Fruits', а' Fruits' не содержит свойства с именем 'Fruits'. Попробуйте создать тип контейнера, содержащий свойство 'Fruits', и десериализуйте это. –

+5

Или пойдите другим способом и сериализуйте что-нибудь в JSON, чтобы понять правильный формат. – DavidG

ответ

3

Предполагая, что вы можете» t изменить json, вам необходимо создать новый класс FruitsWrapper, который имеет Fruits

public class FruitsWrapper 
{ 
    public Fruits Fruits { get; set; } 
} 

и десериализации JSON в экземпляр FruitsWrapper вместо Fruits

FruitsWrapper result = JsonConvert.DeserializeObject<FruitsWrapper>(testJson); 

Работа демо: https://dotnetfiddle.net/nQitSD

+0

спасибо, что он отлично работал. – Gopichandar

1

строка JSON должна быть:

string testJson = @"{ 
         ""Apple"": { 
          ""color"": ""red"", 
          ""size"": ""round""}, 
         ""Orange"": { 
          ""Properties"": { 
           ""color"": ""red"", 
           ""size"": ""round"" } 
           } 
        }"; 

быть десериализован с классом

2

Проблема заключается в том, что внешние наручи в вашем Json соответствует типу, который вы пытаетесь десериализации.

Так что:

string testJson = @"{ 
         ""Fruits"": { ... } 
        }"; 

Соответствует фруктам, так это то, что вы пытаетесь десериализации.

string testJson = @"{ 
         ""Fruits"": { ... } 
         ^--+-^ 
          | 
          +-- this is assumed to be a property of this --+ 
                      | 
               +------------------------+ 
               | 
               v--+-v 
Fruits result = JsonConvert.DeserializeObject<Fruits>(testJson); 

Однако Fruits тип не имеет свойство с именем Fruits и, таким образом, ничего не десериализации.

Если Json не может быть изменен, необходимо создать тип контейнера, который вы десериализации вместо этого, как это:

public class Container 
{ 
    public Fruits Fruits { get; set; } 
} 

Тогда вы можете десериализации, что:

Container result = JsonConvert.DeserializeObject<Container>(testJson); 
0

Вы JSON строка не является правильным (как уже отмечалось), но я добавляю это поможет вам найти правильный формат.Учитывая, у вас есть fruit объект вроде этого:

var fruit = new Fruits 
{ 
    apple = new Apple { color = "red", size = "massive" }, 
    orange = new Orange { properties = new Properties { color = "orange", size = "mediumish" } } 
}; 

Вы можете сериализация это JSON:

var testJson = JsonConvert.SerializeObject(fruit); 

И теперь вы можете увидеть сериализованные выход будет выглядеть следующим образом: (слегка отформатированный)

{"apple": 
    {"color":"red","size":"massive"}, 
"orange": 
    {"properties": 
     {"color":"orange","size":"mediumish"}}} 

И это будет легко deserialise обратно в объект:

fruit = JsonConvert.DeserializeObject<Fruits>(testJson); 
Смежные вопросы