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

.net 如何让Newtonsoft.Json以我想要的方式序列化属性名,.net,json.net,.net-5,.net,Json.net,.net 5,我试图以JSON结尾,如下所示: {"KIBANA_INDEX":"whatever"} [JsonProperty(PropertyName ="KIBANA_INDEX")] public string KibanaIndex{ get; set; } 但是当我尝试像这样使用JsonPropertyAttribute时: {"KIBANA_INDEX":"whatever"} [Json

我试图以JSON结尾,如下所示:

{"KIBANA_INDEX":"whatever"}
[JsonProperty(PropertyName ="KIBANA_INDEX")]
public string KibanaIndex{ get; set; }
但是当我尝试像这样使用
JsonPropertyAttribute
时:

{"KIBANA_INDEX":"whatever"}
[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"}
{"KIBANA_INDEX":"whatever","anotherProperty":"whatever"}
在这里拉小提琴:

我怀疑你实际上是在使用一个。此解析器将导致所有属性名以驼峰大小写形式输出,包括通过
[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"}
小提琴:

如果这不是您想要的行为,那么很容易改变。要做到这一点,只需将解析器中
NamingStrategy
上的属性设置为
false
,如下所示。(注意,在本例中,我向
Foo
类添加了另一个属性,以表明驼峰式大小写仍然适用于没有
[JsonProperty]
属性的属性。)

输出:

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

小提琴手:

@Qpirate那会有用吗?问题在于属性名,而不是属性值,我是否需要手动滚动KIBANA_索引属性所在的整个(相当大)对象。。。。在这种情况下,使用json.net毫无意义……我仍然有一些困惑。我尝试了相同的代码,我能够得到{“KIBANA_INDEX”:“whatever”}作为序列化响应。我不确定我是否理解确切的问题。你是在尝试序列化一个大模型来获得这样的JSON吗?我对它进行了进一步的研究,得到了与@Sangeethnandakumar相同的响应,但我使用的是一个简单的类,我们可以得到你的完整模型吗?您是否有自定义串行服务器设置?可能有一个合同解决者在做这种奇怪的行为你完全正确!在我不知道的情况下,我们在没有关闭OverrideSpecifiedNames的情况下安装了CamelCasePropertyNamesContractResolver。非常感谢。没问题;很高兴我能帮忙!