你好,
我只是想知道是否有理由将 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 属性使用自定义序列化时可能也是如此。
有什么我想念的吗?
谢谢,
亚历克斯
要重现该问题:
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; }
键被更改,我尝试将ProcessDictionaryKeys
为false
。
它们设置为 true 是因为这一直是CamelCasePropertyNamesContractResolver
的默认行为。 后来我添加了命名策略,并决定让它们的行为有所不同,但是出于向后兼容性的原因,我无法更改解析器。
最有用的评论
它们设置为 true 是因为这一直是
CamelCasePropertyNamesContractResolver
的默认行为。 后来我添加了命名策略,并决定让它们的行为有所不同,但是出于向后兼容性的原因,我无法更改解析器。