JsonConvert.DeserializeObject не может десериализовать действительный JSON - PullRequest
0 голосов
/ 06 июня 2018

Я озадачен тем, что метод DeserializeObject не может десериализовать действительный JSON:

string source = JsonConvert.SerializeObject(data.Source);
Maintenance ticket_data = JsonConvert.DeserializeObject<Maintenance>(source); //breaks here

Когда я достигаю своей конечной точки, я получаю следующее:

"ExceptionMessage": "При анализе значения обнаружен неожиданный символ: {. Path 'elements', строка 21, позиция 5."

Я вижу, где это происходит.Elements имеет много разных атрибутов, Elements - это массив.

В классе Maintenance у меня есть:

public IEnumerable<string> Elements { get; set; }

Я использовал веб-сайт JSONLint, чтобы убедиться, что source был действительным JSON, и это так.

Класс обслуживания

Некоторые выходные данные JSON:

{
  "doc_type": "ticket",
  "updated_date": 12345,
  "ticket_number": "1234",
  "start": 1234,
  "summary": "hello",
  "description": "do stuff",
  "active": true,
  "related_tickets": [],
  "tags": [],
  "elements": [
    {
      "last_updated": 5678,
      "entry_id": null,
      "name": "something",

Любая идея о том, почему я не могу десериализовать этот JSON, будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Мне кажется, проблема в том, что ваши элементы не являются массивом строк, которые вы определили в объекте.Судя по фрагменту JSON, у вас есть объекты внутри массива elements.

"elements": [{
      "last_updated": 5678,
      "entry_id": null,
      "name": "something",
}

Это определяет объект со свойствами last_updated, entry_id, name, поэтому он должен отображаться в класс или словарь, как кто-то уже предложилв комментариях.

Иначе это должно выглядеть примерно так в JSON:

"elements": ["string1", "string2", "string3"]
0 голосов
/ 06 июня 2018

Ошибка связана с десериализацией списка объектов : elements[{}] в список string элементов:public IEnumerable<string> Elements

То, что вы можете сделать, это создать класс-оболочку Elements со свойствами, которые соответствуют полезной нагрузке JSON, например

 public class Elements {
  public DateTime last_updated {get;set;}
  public int? entry_id {get; set;}
  public string name {get; set;}
 } 

, тогда в вашем Maintenance.cs вы можете изменить Elements свойство по

public IEnumerable<Elements> Elements { get; set; }

Также обратите внимание на тип данных в полезной нагрузке JSON.Некоторые не строки.например, last_updated

0 голосов
/ 06 июня 2018

Вы должны использовать List или IEnumerable из обслуживания с поддержкой строк, например, такого кода:

var ticket_data = JsonConvert.DeserializeObject<List<string>>(source);

, а затем установить свой элемент класса обслуживания, как этот код

    Elements =ticket_data ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...