首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果名称大写,则忽略JsonProperty

如果名称大写,则忽略JsonProperty
EN

Stack Overflow用户
提问于 2018-02-06 16:30:31
回答 2查看 8.8K关注 0票数 4

我希望能够使用CamelCasePropertyNameContractResolver,但对特定的属性名称重写它。为此,我使用JsonProperty属性。这很好,除非我选择的名字完全大写。有什么不对的地方吗?怎样才能避开它?

在下面的示例中,Bar在不使用CamelCasePropertyNameContractResolver时被序列化为"BAR",但在使用解析器时被序列化为"bar"。在这两种情况下,FooCamelCaseProperty都是正确序列化的。

代码语言:javascript
复制
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace ConsoleTester
{
    class Program
    {
        static void Main(string[] args)
        {
            var foo = new FooBar {CamelCaseProperty = "test", Foo = "test", Bar = "test" };
            var output = JsonConvert.SerializeObject(foo);
            // output "CamelCaseProperty", "fOO", "BAR"

            var output2 = JsonConvert.SerializeObject(foo, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
            // output "camelCaseProperty", "fOO", "bar"
        }
    }

    public class FooBar
    {
        public string CamelCaseProperty { get; set; }
        [JsonProperty("fOO")]
        public string Foo { get; set; }
        [JsonProperty("BAR")]
        public string Bar { get; set; }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-06 21:24:38

你看到这个的原因是CamelCasePropertyNamesContractResolver被故意设计为覆盖字典键显式设置属性名称的大小写,从参考源中可以看到这一点。

代码语言:javascript
复制
public CamelCasePropertyNamesContractResolver()
{
    NamingStrategy = new CamelCaseNamingStrategy
    {
        ProcessDictionaryKeys = true,
        OverrideSpecifiedNames = true
    };
}

如果您不想这样做,您可以使用几个选项来防止显式名称的大小写,而无需创建您自己的自定义契约解析器类型。

首先,可以使用带有的DefaultContractResolver进行序列化。

代码语言:javascript
复制
var settings = new JsonSerializerSettings 
{ 
    ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() }
};
var output2 = JsonConvert.SerializeObject(foo, settings);

这使得CamelCaseNamingStrategy.OverrideSpecifiedNames的默认值为false

其次,如果您无法访问框架的契约解析器,可以在特定属性上设置JsonPropertyAttribute.NamingStrategyType = typeof(DefaultNamingStrategy),如下所示:

代码语言:javascript
复制
public class FooBar
{
    public string CamelCaseProperty { get; set; }

    [JsonProperty("fOO")]
    public string Foo { get; set; }

    [JsonProperty("BAR", NamingStrategyType = typeof(DefaultNamingStrategy))]
    public string Bar { get; set; }
}

第三,如果您希望整个对象忽略当前契约解析器的命名策略,则可以将[JsonObject(NamingStrategyType = typeof(TNamingStrategy))]应用于对象:

代码语言:javascript
复制
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class FooBar
{
    public string CamelCaseProperty { get; set; }

    [JsonProperty("fOO")]
    public string Foo { get; set; }

    [JsonProperty("BAR")]
    public string Bar { get; set; }
}

备注:

  • 虽然修改CamelCasePropertyNamesContractResolver实例的CamelCasePropertyNamesContractResolver也是可能的,但由于后者的在每种类型的所有实例之间共享合约信息。,如果应用程序尝试使用多个CamelCasePropertyNamesContractResolver实例,则可能会产生意外的副作用。在DefaultContractResolver中不存在这样的问题,因此当需要对套管逻辑进行任何定制时,使用起来更安全。
  • 在使用或子类DefaultContractResolver时,您可能希望缓存契约解析器获得最佳性能,因为它不会在每种类型的所有实例之间全局共享契约信息。
  • 我不知道为什么Json.NET的camel解析器被设计用来覆盖指定的名称,这可能是出于历史原因。
  • 命名策略最初是在Json.NET 9.0.1中引入的,所以这个答案只适用于该版本和以后版本。
票数 15
EN

Stack Overflow用户

发布于 2018-02-06 17:47:58

JsonProperty属性在使用ContractResolver时不被接受。

要解决这个问题,您可以做的是覆盖ContractResolver:

代码语言:javascript
复制
public class MyResolver : CamelCasePropertyNamesContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        if(member.GetCustomAttribute<JsonPropertyAttribute>() is JsonPropertyAttribute jsonProperty)
        {
            property.PropertyName = jsonProperty.PropertyName;
        }

        return property;
    }
}

用你的救世主:

代码语言:javascript
复制
var output2 = JsonConvert.SerializeObject(foo, new JsonSerializerSettings { ContractResolver = new MyResolver() });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48647650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档