【发布时间】:2025-11-24 02:45:01
【问题描述】:
我正在尝试序列化/反序列化字典,问题是我使用StringComparer.OrdinalIgnoreCase 比较器创建字典。
这是我遇到的问题的代码 sn-p:
var dict = new Dictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase);
dict["x"] = new Dictionary<string, string>();
dict["x"]["y"] = "something";
var serialized = JsonConvert.SerializeObject(dict);
var unSerialized = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(serialized);
Console.WriteLine((dict.Comparer == unSerialized.Comparer ? "Same" : "Different"));
在控制台上打印出以下内容:
Different
显然 JSON 序列化程序不会序列化我在创建字典时设置的比较器,但问题是我无法在事后设置比较器,因为Dictionary<TKey, TValue>.Comparer 是只读的。
我确定它与某些自定义 JsonSerializerSetting 有关,但我似乎无法弄清楚如何拦截集合创建并返回具有不同比较器的字典。
【问题讨论】:
-
好的,Ron,假设您将此 json 发送到另一个站点。它怎么知道你是如何构造这个字典的(你甚至可以使用其他没有任何字典的方法来创建相同的 json)
-
@L.B 此应用程序不是基于 Web 的,出于其他业务原因,我使用 JSON 通过 XML 进行序列化。数据不会由外部系统处理。
-
只是举例说明逻辑。 json 的接收者不知道你是如何创建它的。它甚至不知道你用来创建它的语言。所以你做出了错误的假设
-
我不确定我是否理解,系统是独立的,它使用 JSON 仅用于数据的文件持久化,而不是传输到另一个系统。 JSON 的接收者也始终是它的生产者。问题是在运行时我需要以不区分大小写的方式比较字典中的键,但我无法使用不区分大小写的比较器检索字典。
-
假设你 DeserializeObject 使用这个 json
{"prop1:"val1"}。它可以是字典,也可以是具有单个属性的类。它可以用任何比较器序列化。所以JsonConvert.DeserializeObject无从得知。
标签: c# dictionary json.net desktop-application