Примечание: я использую System.Text.Json
, а не JSON.NET
, на который есть аналогичный вопрос, на который был дан ответ. Мне нужен тот же ответ, но для System.Text.Json
. Я хотел бы написать свой класс Json и убедиться, что он читается человеком. Для этого я установил отступ в true в опциях. Тем не менее, класс содержит свойство List<double>
, которое я не хочу делать отступом, так как это делает файл очень длинным.
Итак, у меня есть это:
public class ThingToSerialize
{
public string Name {get;set;}
//other properties here
public List<double> LargeList {get;set;}
};
var thing = new ThingToSerialize {Name = "Example", LargeList = new List<double>{0,0,0}};
var options = new JsonSerializerOptions
{
WriteIndented = true
};
options.Converters.Add(new DontIndentArraysConverter());
var s = JsonSerializer.Serialize(thing, options);
, и я хочу, чтобы оно сериализовалось так:
{
"Name": "Example",
"LargeList ": [0,0,0]
}
Не это (или что-то в этом роде):
{
"Name": "Example",
"LargeList ": [
0,
0,
0
]
}
Я написал JsonConverter
для достижения этой цели:
public class DontIndentArraysConverter : JsonConverter<List<double>>
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<double>);
}
public override List<double> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return JsonSerializer.Deserialize<List<double>>(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, List<double> value, JsonSerializerOptions options)
{
var s = JsonSerializer.Serialize(value);
writer.WriteStringValue(s);
}
}
Однако это записывает массив как строку, которую я на самом деле не хочу. Каков наилучший подход для этого?
т.е. вы получаете «[1,2,3]» вместо [1,2,3]
Во-вторых, переданный объект writer
в функцию Write
имеет свойство Options
, но это нельзя изменить. Поэтому, если я выписываю массив вручную, используя объект записи, он имеет отступ.