使用 Json.Net 序列化哈希表

Posted

技术标签:

【中文标题】使用 Json.Net 序列化哈希表【英文标题】:Serialize hashtable using Json.Net 【发布时间】:2015-03-12 10:56:36 【问题描述】:

我有一个哈希表,其键是整数类型,但是当使用 json.net 反序列化时,键以字符串形式返回,有没有办法使用 json.net 序列化/反序列化将键类型保留在哈希表上?此哈希表是“MyType”类型的属性

var settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;
string json = JsonConvert.SerializeObject(o, Formatting.Indented, settings);

 mo = JsonConvert.DeserializeObject<MyType>(json, new JsonSerializerSettings  TypeNameHandling = TypeNameHandling.Objects );

public Hashtable jsonViews

    get  return mViews; 
    set  mViews = value; 

【问题讨论】:

你是如何反序列化哈希表的?可以出示一下代码吗? 我已经编辑了我的问题 你能把 MyType 类也发一下吗?至少公共属性... 代码不完整。 MyType 的定义在哪里?请发布生成的 Json 字符串,虽然我怀疑键 序列化为字符串,即包含在 ". Json 不提供任何模式,因此不擅长保留类型。 1 的密钥与 "1" 一样有效。除非您在反序列化时指定所需的类型,否则 Json.NET(或任何其他库)将选择最合适的类型 - 1 为 int,"1" 为 string。 HashTable 的键是一个对象,即未指定。如果你想要一个特定的键,你应该使用像 Dictionary 或 MultiValueDictionary<> 这样的类 【参考方案1】:

问题在于 System.Collections.Hashtable 不是强类型的 - 它可以保存任何类型的对象,并且 JSON.NET 很可能会序列化哈希表内容的字符串表示形式。

在您花太多时间按摩 JSON.NET 序列化器/反序列化器来弥补这一点之前,您可能需要考虑将您的 Hashtable 换成 Dictionary&lt;TKey, TValue&gt;。它在性能方面几乎相同,但为您提供了强类型集合的优势和安全性。

强类型集合将解决您的 Json.NET 反序列化问题,因为 Json.NET 可以从字典中推断类型。

Dictionary&lt;TKey,TValue&gt; 的使用超过了Hashtable is discussed here。

【讨论】:

【参考方案2】:

这是我为帮助我解决这个问题而编写的通用静态扩展方法。我基本上希望这段代码永远不会爆炸,即使数据以某种方式损坏。

    public static T Read<T>(this Hashtable hash, string key)
    
        if (!hash.ContainsKey(key))
            return default;
        if (hash[key] is T)
            return (T)hash[key];
        if (hash[key] is JToken token)
            return token.ToObject<T>();

        try
        
            return (T)Convert.ChangeType(hash[key], typeof(T));
        
        catch (InvalidCastException)
        
            Debug.LogWarning($"key had the wrong type of hash[key].GetType()");
            return default;
        
    

【讨论】:

以上是关于使用 Json.Net 序列化哈希表的主要内容,如果未能解决你的问题,请参考以下文章

JSON.net 直接从 oledbconnection 序列化

JSON.net 直接从 oledbconnection 序列化

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json反序列化json示例教程

使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON.net 的json的序列化与反序列化

尝试使用 JSON.NET 反序列化带有 [] 字符的 JSON

使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具