默认情况下,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"}
在这里提琴: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"}
小提琴:https://dotnetfiddle.net/KBhreA
如果这不是你想要的行为,很容易改变。为此,您只需将解析器中NamingStrategy 上的OverrideSpecifiedNames 属性设置为false,如下所示。 (请注意,我在此示例中向 Foo 类添加了另一个属性,以表明驼峰式大小写仍然适用于 不 具有 [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"}
小提琴:https://dotnetfiddle.net/0qeP3o