将JSON转换为对象,然后根据对象类型执行不同的操作

时间:2016-05-24 06:56:20

标签: c# json serialization

以前,我有一个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();

3 个答案:

答案 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对象。 因此,返回的值将是不同的类型,分别为JArrayJObject

答案 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属性以确定应运行哪个代码段。