以前,我有一个OrderedDictionary,我把它转换成JSON,然后在代码的某些部分我需要将它反序列化回OrderedDictionary。
现在,我需要将该属性的类型更改为List。我需要做一个向后兼容。我如何进行编码,以便在反序列化JSON时,将其反序列化为对象,然后检查对象是否为List,执行某些操作,否则如果object是OrderedDictionary,则执行某些操作。
目前,如果我将其反序列化为一个对象,我会得到一个JObject。我使用的是Newtonsoft.Json。
我期待的是:
var x = JsonConvert.DeserializeAnonymousType(jsonString, new object());
if (x is List)
doSomething1();
else if (x is OrderedDictionary)
doSomething2();
答案 0 :(得分:2)
使用类似的类型:
var x = JsonConvert.DeserializeAnonymousType(json,new OrderedDictionary());
System.Console.WriteLine(x.GetType());
输出:
System.Collections.Specialized.OrderedDictionary
答案 1 :(得分:2)
使用以下:
object x = JsonConvert.DeserializeObject(jsonString);
if (x is Newtonsoft.Json.Linq.JObject) // OrderedDictionary
doSomething1();
else if (x is Newtonsoft.Json.Linq.JArray) // List
doSomething2();
这只适用于Json.NET,jsonString
也必须由Json.NET进行字符串序列化。
从Json.NET的Serialization Guide开始,List(已实现IList
)将在JSON数组中序列化,OrderedDictionary
(已实现IDictionary
)将被序列化为JSON对象。
因此,返回的值将是不同的类型,分别为JArray
和JObject
。
答案 2 :(得分:1)
JSON库不会(不能)帮助您确定最佳目标类型,您需要告诉它。如果您不提供“目标”,那么您认为“正确”的目标类型是什么?
//JSON: { Name = "sweety", Age = 1 }
class Kid
{
public string Name { get; set; }
public int Age { get; set }
}
class Cat
{
public string Name { get; set; }
public int Age { get; set }
}
换句话说,JSON字符串没有它来自的类型的信息。因此,您需要告诉库将JSON字符串反序列化为特定类型(甚至是匿名类型)。
我认为您不应该序列化OrderedDictionary<K,V>
(或List<T>
)本身,而是序列化其中的项目,并添加一个指示类型的属性:
class MyClass
{
public string Flag { get; set; }
public MyData[] DataObjects { get; set; }
}
将词典/列表中的项目放入MyClass
实例并序列化(使用不同的Flag属性值)。在反序列化后,您将始终获得MyClass
的实例,请检查Flag
属性以确定应运行哪个代码段。