Я написал пользовательский конвертер system.text.json для стороны Read()
пользовательского конвертера. Однако для стороны Write()
я бы просто хотел использовать функцию записи по умолчанию для сериализации объекта вместо того, чтобы вручную выполнять сериализацию объекта. Я начал с...
public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
Я надеялся, что смогу просто использовать стандартный JsonSerializer.Serialize(Customer)
в Write()
методе. Что-то вроде...
public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
return JsonSerializer.Serialize(value);
}
Однако, похоже, это возвращается null
. Я предполагаю, что все, что я делаю, это вложение одного и того же поведения.
В знак отчаяния я также попытался удалить метод Write()
, надеясь, что стандартная функциональность заполнит этот пробел, но я получаю следующее сообщение об ошибке сборки...
CS0534 'CustomerJsonConverter' does not implement inherited abstract member
'JsonConverter<Customer>.Write(Utf8JsonWriter, Customer, JsonSerializerOptions)'
Newtonsoft.Json имеет свойства CanRead
и CanWrite
, для которых можно установить значение False. Это заставляет преобразователь использовать функции преобразователя по умолчанию при десериализации и сериализации соответственно.
Я надеюсь, что в System.Text.Json есть что-то подобное?
Используя предложение @Guilherme... это частично работает. Однако этот подход дает неполный объект Json.
Для фона, когда я десериализую свой исходный Json, мне приходится иметь дело с ситуацией, когда исходный Json (над которым я не контролирую) имеет поле, которое может быть пустым ""
, или объектом { "key": "value" }
, или массивом [{ "key": "value" },{ "key": "value" }]
. В Read()
(десериализаторе) я обрабатываю это и вывожу согласованный массив.
Но теперь, когда я сериализую полученный объект, массив Addresses всегда пуст (пустой). Вот результат, когда я оставляю метод Write()
пустым. Обратите внимание, что «Адреса» не имеет значения или разделителя-запятой.
{
"Customer": {
"firstName": "John",
:
other values
:
"Addresses": "Phone": "01234567890"
}
}
Должен ли я свернуть свой собственный JsonDocument и использовать его в методе Write?
Связанные или повторяющиеся: Как использовать сериализацию по умолчанию в пользовательском System.Text.Json JsonConverter?. Соглашаться?
Я разработал ответ. :-)
Когда я запрашиваю экземпляр Customer
для сериализации...
string json = JsonSerializer.Serialize(customer);
... когда сериализатор достигает подкласса Addresses
внутри Customer
, он вызывает метод Write()
моего пользовательского преобразователя, передавая ему текущий экземпляр Json Writer, экземпляр объекта Addresses, который нужно сериализовать, и любые параметры преобразователя.
Проще говоря, поскольку я правильно десериализовал исходный причудливый Json в методе Read()
моего пользовательского конвертера и создал соответствующий List<>, Write()
может просто сериализовать экземпляр Addresses
с помощью класса Addresses. Код выглядит так...
public override void Write(Utf8JsonWriter writer, Addresses value, JsonSerializerOptions options)
{
JsonSerializer.Serialize(writer, value);
}
Не следует ли также передавать параметры, так как они будут потеряны для всех последующих детей?
Возвращает пустоту. Вы пробовали оставить его пустым?