使用 Json.Net 序列化哈希表
Serialize hashtable using Json.Net
我有一个哈希表,其键是整数类型,但是当使用 json.net 反序列化时,键以字符串形式返回,有没有办法使用 json.net serialization/deserialization?此哈希表是 '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; }
}
问题是 System.Collections.Hashtable
不是强类型的 - 它可以容纳任何类型的对象,并且 JSON.NET 很可能是序列化哈希表内容的字符串表示形式。
在你花太多时间按摩 JSON.NET serializer/deserializer 来弥补这一点之前,你可能需要考虑将你的 Hashtable
换成 Dictionary<TKey, TValue>
。它在性能方面几乎相同,但为您提供了强类型集合的优势和安全性。
强类型集合将解决您的 Json.NET 反序列化问题,因为 Json.NET 可以从字典中推断类型。
Dictionary<TKey,TValue>
优于 Hashtable
is discussed here。
这是我编写的一个通用静态扩展方法来帮助我解决这个问题。我基本上希望即使数据以某种方式损坏,这段代码也永远不会崩溃。
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 serialization/deserialization?此哈希表是 '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; }
}
问题是 System.Collections.Hashtable
不是强类型的 - 它可以容纳任何类型的对象,并且 JSON.NET 很可能是序列化哈希表内容的字符串表示形式。
在你花太多时间按摩 JSON.NET serializer/deserializer 来弥补这一点之前,你可能需要考虑将你的 Hashtable
换成 Dictionary<TKey, TValue>
。它在性能方面几乎相同,但为您提供了强类型集合的优势和安全性。
强类型集合将解决您的 Json.NET 反序列化问题,因为 Json.NET 可以从字典中推断类型。
Dictionary<TKey,TValue>
优于 Hashtable
is discussed here。
这是我编写的一个通用静态扩展方法来帮助我解决这个问题。我基本上希望即使数据以某种方式损坏,这段代码也永远不会崩溃。
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;
}
}