使用Newtonsoft创建自定义JsonConverter时尊重JsonSerializer设置 - c#

我为特定类型创建了一个自定义JsonConverter。

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装饰属性以更改名称。

如何为正在序列化的属性解析正确的属性名称?

参考方案

如果您查看内置的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();
    }
}

JSON.NET如何删除节点 - c#

我有一个像下面这样的json:{ "d": { "results": [ { "__metadata": { }, "prop1": "value1", "prop2": "value2", "__some&#…

JSON PATH字段NULL检查表达式 - java

我有一个像bellow的json数组:{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sa…

json_encode网址失败 - php

有人在this bug附近吗?echo json_encode(array('url'=>'/foo/bar')); {"url":"\/foo\/bar"} 我使用Zend_Json and Zend_Json_Expr以便我甚至可以在js对象中获取回调函数-但我无法获得…

json.dumps弄乱顺序 - python

我正在使用json module创建一个包含类似条目的json文件json.dumps({"fields": { "name": "%s", "city": "%s", "status": "%s", "cou…

如何从JSON文件反序列化.NET Core中封装的对象表? - c#

我想从外部API检索足球联赛的集合。来自服务器的响应如下所示:{ "api": { "results": 1496, "leagues": [ { "league_id": 1, ..... 返回的对象由“ api”字段组成,其中包含“结果”和“联盟”。我想反序列化代码并将其映射…