如何让 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
我试图以这样的方式结束 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