Запись списка <double>в массив Json без отступов с использованием System.Text.Json - PullRequest
0 голосов
/ 15 октября 2019

Примечание: я использую 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, но это нельзя изменить. Поэтому, если я выписываю массив вручную, используя объект записи, он имеет отступ.

...