如何让 Newtonsoft.Json 以我想要的方式序列化 属性 名称

How to get Newtonsoft.Json to serialize a property name the way I want

我试图以这样的方式结束 JSON:

{"KIBANA_INDEX":"whatever"}

但是当我尝试像这样使用 JsonPropertyAttribute 时:

[JsonProperty(PropertyName ="KIBANA_INDEX")]
public string KibanaIndex{ get; set; }

我最终得到的是 JSON 这样的:

{"kibanA_INDEX":"whatever"}

有什么办法可以让Newtonsoft.Json屈服于我的意志吗?

默认情况下,Json.Net 不会那样做。如果您在 [JsonProperty] 属性中提供特定名称,序列化程序将遵守它,您应该会在输出中看到它。下面是一个示例程序来演示:

using System;
using Newtonsoft.Json;
                    
public class Program
{
    public static void Main()
    {
        var foo = new Foo { KibanaIndex = "whatever" };
        var json = JsonConvert.SerializeObject(foo);
        Console.WriteLine(json);
    }
}

public class Foo
{
    [JsonProperty(PropertyName = "KIBANA_INDEX")]
    public string KibanaIndex { get; set; } 
}

输出:

{"KIBANA_INDEX":"whatever"}

Fiddle 这里:https://dotnetfiddle.net/N753GP

我怀疑你用的是CamelCasePropertyNamesContractResolver。此解析器将导致所有 属性 名称以驼峰式大小写输出,包括您通过 [JsonProperty] 属性为其指定名称的名称。这里又是同一个例子,只是改为使用 CamelCasePropertyNamesContractResolver:

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
                    
public class Program
{
    public static void Main()
    {
        var foo = new Foo { KibanaIndex = "whatever" };
        var resolver = new CamelCasePropertyNamesContractResolver();
        var settings = new JsonSerializerSettings { ContractResolver = resolver };
        var json = JsonConvert.SerializeObject(foo, settings);
        Console.WriteLine(json);
    }
}

这是输出,看起来应该很熟悉:

{"kibanA_INDEX":"whatever"}

Fiddle: https://dotnetfiddle.net/KBhreA

如果这不是您想要的行为,很容易更改。为此,您只需将解析器中 NamingStrategy 上的 OverrideSpecifiedNames 属性 设置为 false,如下所示。 (请注意,在此示例中,我向 Foo class 添加了另一个 属性 以表明驼峰式外壳仍然适用于 而不是 的属性有一个 [JsonProperty] 属性。)

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
                    
public class Program
{
    public static void Main()
    {
        var foo = new Foo { KibanaIndex = "whatever", AnotherProperty = "whatever" };
        var resolver = new CamelCasePropertyNamesContractResolver();
        resolver.NamingStrategy.OverrideSpecifiedNames = false;
        var settings = new JsonSerializerSettings { ContractResolver = resolver };
        var json = JsonConvert.SerializeObject(foo, settings);
        Console.WriteLine(json);
    }
}

public class Foo
{
    [JsonProperty(PropertyName = "KIBANA_INDEX")]
    public string KibanaIndex { get; set; } 
    
    public string AnotherProperty { get; set; }
}

输出:

{"KIBANA_INDEX":"whatever","anotherProperty":"whatever"}

Fiddle: https://dotnetfiddle.net/0qeP3o