Как отформатировать пользовательский тип в результате json? - PullRequest
1 голос
/ 29 апреля 2020

У меня есть собственный класс, который в основном сводится к следующему:

public class MyValue
{
    public MyValue(int v)
    {
        Value = v;
    }

    public int Value {get;}
}

Я использую этот класс в качестве свойства для различных классов. Когда мой API возвращает класс (который имеет свойство MyValue), возвращаемое json выглядит так:

"propertyOfTypeMyValue": {
    "value": 4
}

Я не хочу этого. Я хотел бы, чтобы возвращаемый json выглядел так:

"propertyOfTypeMyValue": 4

Возможно ли это? Если да, то как?

1 Ответ

1 голос
/ 29 апреля 2020

Да, вы можете получить желаемый результат, создав собственный JsonConverter для своего MyValue класса, например:

public class MyValueConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(MyValue);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null) 
            return null;
        if (reader.TokenType == JsonToken.Integer) 
            return new MyValue(Convert.ToInt32(reader.Value));
        throw new JsonException("Unexpected token type: " + reader.TokenType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((MyValue)value).Value);
    }
}

Чтобы использовать конвертер, пометьте класс MyValue атрибутом [JsonConverter]:

[JsonConverter(typeof(MyValueConverter))]
public class MyValue
{
    public MyValue(int v)
    {
        Value = v;
    }

    public int Value { get; private set; }
}

Вот рабочая демонстрация: https://dotnetfiddle.net/A4eU87

...