使用 Json.Net 序列化哈希表

本文关键字:哈希表 序列化 Net Json 使用 | 更新日期: 2023-09-27 18:37:24

我有一个键为整数类型的哈希表,但是当使用 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; }
}

使用 Json.Net 序列化哈希表

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

在花费太多时间按摩 JSON.NET 串行器/反序列化器以补偿此问题之前,您可能需要考虑将Hashtable换成Dictionary<TKey, TValue>。它在性能方面几乎相同,但为您提供了强类型集合的优势和安全性。

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

本文讨论Dictionary<TKey,TValue>的使用Hashtable

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

    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;
        }
    }