Использование Newtonsoft JsonConvert для сериализации и десериализации простого класса - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь просто сериализовать и десериализовать простой класс с помощью JsonConvert.SerializeObject (obj) и JsonConvert.DeserializeObject (string).

Я использую это в пользовательском TypeConverter для QueryParameter в .NET Web API Core 2.1.

Но у меня очень странное поведение. Мой класс выглядит так:

public class ListRequestDto {
    public bool? WithCreator { get; set; }
    public int? Skip { get; set; }
    public int? Limit { get; set; }
}

И я пытаюсь сделать следующее:

var test = new ListRequestDto {
    WithCreator = true,
    Skip = 0,
    Limit = 15
};
string ttt = JsonConvert.SerializeObject(test);

Но я получаю следующий вывод:

"MyNameSpace.ListRequestDto"

Если я попробую наоборот:

string json = "{ WithCreator: true, Skip: 0, Limit: 15 }";
JsonConvert.DeserializeObject<ListRequestDto>(json);

Я получаю следующее исключение:

Newtonsoft.Json.JsonSerializationException: "Невозможно десериализовать текущий объект JSON (например, {" name ":" value "}) в тип 'MyNameSpace.ListRequestDto', поскольку для корректной десериализации типа требуется строковое значение JSON. Чтобы исправить эту ошибку, либо измените JSON на строковое значение JSON, либо измените десериализованный тип так, чтобы это был обычный тип .NET (например, не примитивный тип, например, целое число, а не тип коллекции, например, массив или список), который можно десериализовать. из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON. Путь «Пропустить», строка 1, позиция 8. "

Я попытался удалить пустые поля (заменив их обычными примитивами), но это привело к точно такой же ошибке.

Странно то, что если я предоставляю тот же класс, что и тело, это работает. И насколько я знаю, в Web API Core также используется Newtonoft Json Parser.

1 Ответ

0 голосов
/ 15 сентября 2018

Я не знаю, почему это необходимо, но когда я помещаю [JsonObject] в мой класс, это неожиданно работает. Исключение фактически подсказало мне сделать это, но я не понимаю, почему это необходимо, если в документации нет такого случая.

Таким образом, решение следующих проблем решило:

[JsonObject]
public class ListRequestDto {
    public bool? WithCreator { get; set; }
    public int? Skip { get; set; }
    public int? Limit { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...