Десериализация объекта JSON, содержащего другой объект

#c# #json #json.net #deserialization

#c# #json #json.net #десериализация

Вопрос:

Я пытаюсь десериализовать эту строку JSON с помощью Newtonsoft.Библиотека Json. Но возвращаемый десериализованный объект всегда возвращает null . Я думаю, что это связано с объектом address внутри объекта player.

Это строка JSON

 {  
   "player":{  
      "id":"ed704e61-f92b-4505-b087-8a47ca4d1eaf",
      "firstName":"Jack",
      "lastName":"Russel",
      "nickname":"Barky",
      "dateOfBirth":"1995-08-16T00:00:00",
      "sex":"m",
      "address":{  
         "street":"Elmstreet",
         "number":"5",
         "alphaNumber":"",
         "poBox":"",
         "postalCode":"90001",
         "city":"Los Angeles",
         "country":"United States"
      },
      "email":[  
         "barky@dog.com",
         "barky@mydogpension.com"
      ],
      "phone":[  
         "0123 45 67 89 10"
      ]
   },
   "requestReference":2000,
   "requestStatus":"Request OK",
   "requestDetails":null
}
  

Это классы RootObject, Player и Address . Это объект Player корневого объекта, который продолжает возвращать нулевое значение для приведенной выше строки JSON. Поэтому при вызове offcourse генерируется исключение nullreference:

 public class RootObject
{
    public Player player { get; set; }
    public int requestReference { get; set; }
    public string requestStatus { get; set; }
    public string requestDetails { get; set; }
}    

public class Address
{
    public string street { get; set; }
    public string number { get; set; }
    public string alphaNumber { get; set; }
    public string poBox { get; set; }
    public string postalCode { get; set; }
    public string city { get; set; }
    public string country { get; set; }
}

public class Player
{
    public Guid id { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string nickname { get; set; }
    public DateTime dateOfBirth { get; set; }
    public string sex { get; set; }
    public Address address { get; set; }
    public List<string> email { get; set; }
    public List<string> phone { get; set; }
}
  

Это строка кода, используемая для десериализации:

RootObject playerRoot = JsonConvert.DeserializeObject<RootObject>(_the_json_string_shown_above);

Комментарии:

1. Ваш код работает для меня с Json. Net 7

2. Для меня все десериализуется нормально — просто проверил ваш код дословно. Использование Newtonsoft. Версия Json 9.0.1

Ответ №1:

Я использовал Newtonsoft.Json 8.0.2.19309. Мне пришлось добавить атрибут JsonProperty к объекту Address внутри класса Player. Затем объект десериализуется просто отлично.

 public class Player
{
    public Guid id { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string nickname { get; set; }
    public DateTime dateOfBirth { get; set; }
    public string sex { get; set; }
    [JsonProperty]
    public Address address { get; set; }
    public List<string> email { get; set; }
    public List<string> phone { get; set; }
}
  

Комментарии:

1. Итак, какая версия Newtonsoft. Вы использовали Json?

2. Newtonsoft. Для этого проекта используется Json 8.0.2.19309.

3. Очень странно, что он не десериализовался бы без [JsonProperty] атрибута, когда он отлично работал с моими и @heinzbeinz. Рад, что в конце концов он заработал 🙂 Счастливого кодирования!