У меня есть несколько POCO, которые можно (де-)сериализовать из/в json. Большая часть контента представляет собой коллекции. Я хочу, чтобы сериализованный JSON содержал определенное свойство только в том случае, если его коллекция не пуста (причины: экономия места, чтобы людям было намного проще увидеть, что важно). Десериализация этих несуществующих свойств должна привести к появлению пустых коллекций в данных.
Как это сделать?
JsonIgnoreCondition не имеет записи, которая бы делала это. Он обрабатывает только значения null/default.
Пример POCO:
public class Data
{
public DocData MainDoc { get; }
public IList SubDocs { get; }
}
Я выполняю (де)сериализацию с помощью JsonSerializer.Serialize и JsonSerializer.Deserialize с аргументом JsonSerializerOptions new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull .
Фактический JSON, если внутри вложенных документов нет содержимого:
{
"MainDoc": { ... },
"SubDocs": [ ]
}
Требуется JSON, если во вложенных документах нет содержимого:
{
"MainDoc": { ... }
}
Я уже пробовал написать собственный преобразователь, возвращающий значение null, если коллекция пуста:
public class Data
{
public DocData MainDoc { get; }
[JsonConverter(typeof(CollectionConverter))]
public IList SubDocs { get; }
}
internal class CollectionConverter : JsonConverter
{
public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var deserialized = (IList?)JsonSerializer.Deserialize(ref reader, typeToConvert, options);
return deserialized ?? List.Empty;
}
public override void Write(Utf8JsonWriter writer, IList values, JsonSerializerOptions options)
{
if (!values.Any())
{
writer.WriteNullValue();
return;
}
writer.WriteStartArray();
foreach (var value in values)
JsonSerializer.Serialize(writer, value, options);
writer.WriteEndArray();
}
}
, надеясь, что JsonIgnoreCondition.WhenWritingNull или JsonIgnoreCondition.WhenWritingDefault будет хорошо сочетаться с этим. Но нет, тогда я просто получаю этот JSON:
{
"MainDoc": { ... },
"SubDocs": null
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... ialization