gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:42:07 26 4
gpt4 key购买 nike

我试图以这样的 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

如果这不是您想要的行为,很容易改变。为此,您只需要设置 OverrideSpecifiedNames解析器中 NamingStrategy 的属性设置为 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"}

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

关于.net - 如何让 Newtonsoft.Json 以我想要的方式序列化属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67401935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com