Newtonsoft.json: CamelCasePropertyNamesContractResolver 上的 OverrideSpecifiedNames 和 ProcessDictionaryKeys 默认值

创建于 2018-11-22  ·  3评论  ·  资料来源: JamesNK/Newtonsoft.Json

你好,

我只是想知道是否有理由将 CamelCasePropertyNamesContractResolver 类中的 ProcessDictionaryKeys 和 OverrideSpecifiedNames 设置默认为 true:
https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/CamelCasePropertyNamesContractResolver.cs#L49 -L50

我最近在使用 JSON.NET 进行 json 序列化/反序列化的消息传递库中发现了一个问题,并且能够使用默认选项将其跟踪到上述类的使用。 问题本身导致了字典通过消息总线发送后更改密钥(所有密钥都是驼峰式的)。

在合同解析器上默认使这些值成为真的决定对我来说似乎不直观,因为这意味着序列化然后反序列化字典不会让您回到开始的地方。 虽然我不确定 OverrideSpecifiedNames 的行为,但我想如果反序列化依赖于自定义构造函数,那么通过 JsonProperty 属性使用自定义序列化时可能也是如此。

有什么我想念的吗?

谢谢,
亚历克斯

最有用的评论

它们设置为 true 是因为这一直是CamelCasePropertyNamesContractResolver的默认行为。 后来我添加了命名策略,并决定让它们的行为有所不同,但是出于向后兼容性的原因,我无法更改解析器。

所有3条评论

要重现该问题:

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace ConsoleApp
{
    class Program
    {
        static T SerializeAndDeserialize<T>(T obj, JsonSerializerSettings settings)
        {
            return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(obj, settings), settings);
        }

        static void Main(string[] args)
        {
            var dict = new Dictionary<string, string> {{"Foo", "Bar"}};

            var settingsWithDictKeysCamelCased = new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };

            var settingsWithDictKeysUnchanged = new JsonSerializerSettings
            {
                ContractResolver = new DefaultContractResolver
                {
                    NamingStrategy = new CamelCaseNamingStrategy()
                }
            };

            var result1 = SerializeAndDeserialize(dict, settingsWithDictKeysCamelCased);
            var result2 = SerializeAndDeserialize(dict, settingsWithDictKeysUnchanged);

            Console.WriteLine(string.Join(", ", result1.Select(kvp => $"{kvp.Key}: {kvp.Value}"))); // foo: Bar
            Console.WriteLine(string.Join(", ", result2.Select(kvp => $"{kvp.Key}: {kvp.Value}"))); // Foo: Bar

            Console.ReadLine();
        }
    }

}

我也看到了这种行为,其中public Dictionary<string, bool> Blah { get; }键被更改,我尝试将ProcessDictionaryKeysfalse

它们设置为 true 是因为这一直是CamelCasePropertyNamesContractResolver的默认行为。 后来我添加了命名策略,并决定让它们的行为有所不同,但是出于向后兼容性的原因,我无法更改解析器。

此页面是否有帮助?
0 / 5 - 0 等级