#c# #json.net
Вопрос:
У меня есть asp.net основной веб-api, использующий System.Text.Json для сериализации в JSON. На моем клиенте Blazor wasm я использую json.net, так как NSwag генерирует клиента с помощью этого. Теперь у меня возникла проблема во время десериализации временных интервалов. Я уже добавил пользовательский конвертер:
public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> TimeSpan.Parse(reader.GetString() ?? string.Empty);
public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
Для a TimeSpan.FromHours(3.5)
это возвращает значение json 03:30:00
, которое для меня выглядит нормально. Но когда я пытаюсь разобрать это в json.net Я получаю следующее исключение:
Невозможно десериализовать текущий объект JSON (например, {«имя»:»значение»}) в систему типа’.TimeSpan» , потому что для правильной десериализации типа требуется примитивное значение JSON (например, строка, число, логическое значение, null).
Поэтому я проверил, что json.net сама производит вот это и вышло значение: "02:30:00"
. Когда я добавляю кавычки к указанному выше значению, оно также десериализуется правильно. Есть ли у меня способ рассказать json.net чтобы десериализовать временной интервал без этих дополнительных кавычек?
Комментарии:
1. Вы, вероятно, захотите написать конвертер, будь то для System.Text. Json для сериализации или для JSON.NET при десериализации.
2. @PanagiotisKanavos, когда я просто сериализую промежуток времени, фактический текст JSON в json.net является упомянутым
""02:30:00""
. В Системе.Текст. Джсон, это так"02:30:00"
.3. Опубликуйте фактический текст json. Только числовые значения могут отображаться без кавычек. Если ваша строка JSON содержит
myProp: 03:30:00
недопустимый текст4.
In System.Text.Json it's 02:30:00.
нет, это не так. JSON есть JSON, независимо от того, какую библиотеку вы используете для его создания. Стандартного способа сериализации продолжительности или времени суток (две разные вещи) не существует, поэтому в обоих случаях вам нужен конвертер. Однако в обоих случаях выходные данные всегда будут указаны в кавычках, например{ TimeOfDay: "03:30:00"}
5. Я думаю, мы не говорим об одном и том же. Когда я сериализую только промежуток времени. Я получаю результат выше. Когда я сериализую весь dto, у меня получается что-то вроде
{ "Property" : "03:30:00"}
. Но суть все равно остается в силе. Json.net хочет, чтобы это было{ "Property" : ""03:30:00""}