Соблюдение настроек JsonSerializer при создании пользовательского JsonConverter с Newtonsoft - PullRequest
3 голосов
/ 03 апреля 2020

Я создал пользовательский JsonConverter для указанного типа * 1013. *.

public class FooNewtonsoftConverter : JsonConverter<Foo>{
    public override void WriteJson(JsonWriter writer, Foo value, JsonSerializer serializer)
    {
        writer.WriteStartObject();

        // Should it be serialized as "Id" or "id"?
        writer.WritePropertyName("id");
        writer.WriteValue(value.Id);

        writer.WriteEndObject();
    }
}

Можно настроить JsonSerializer для использования другой стратегии именования, например CamelCasePropertyNamesContractResolver или изменения NamingStrategy в CamelCaseNamingStrategy.

Вы также можете украсить свойство с помощью JsonProperty, чтобы изменить имя.

Как можно разрешить правильные имена свойств для сериализуемых свойств?

1 Ответ

2 голосов
/ 03 апреля 2020

Если вы посмотрите на встроенные KeyValuePairConverter, вы увидите, что они используют

var resolver = serializer.ContractResolver as DefaultContractResolver;

writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(KeyName) : KeyName);

В вашем сценарии это будет выглядеть примерно так:

public class FooNewtonsoftConverter : JsonConverter<Foo>{
    public override void WriteJson(JsonWriter writer, Foo value, JsonSerializer serializer)
    {
        writer.WriteStartObject();

        var resolver = serializer.ContractResolver as DefaultContractResolver;
        writer.WritePropertyName(resolver?.GetResolvedPropertyName("Id") ?? "Id");
        writer.WriteValue(value.Id);

        writer.WriteEndObject();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...