2

我在将一些 JSON 字符串反序列化回 .net 对象时遇到问题。我有一个容器类,其中包含来自外部的一些信息,并且有一个字段调用ClassType定义了该信息的类型,实际内容在另一个属性中,当前可以是任何东西,因此我们将其定义为 Object 类型。

以下是有助于理解问题的 .net 类定义。

class ClassOne
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class ClassTwo
{
    public string AddressLine { get; set; }
    public string AddressLine2 { get; set; }
}

class ClassThree
{
    public string Country { get; set; }
    public string Passport { get; set; }
}

class ContainerClass
{
    public string ClassType { get; set; }
    public object ClassContent { get; set; }
}

当以 JSON 格式从外部获取信息时,它将类似于:

{"ClassType":"Class1","ClassContent":{"Name":"James","Age":2}}

我正在使用 Newtonsoft JSON.net 库来反序列化 JSON 字符串。似乎默认的反序列化函数只会将其反序列化为Newtonsoft.Json.Linq.JContainer. 我只是想知道如何ClassContent根据ClassType定义编写一些转换器来反序列化。任何代码示例都将受到高度赞赏。

4

4 回答 4

1

我会走dynamic的路,比如:

string json = @"{""ClassType"":""Class1"",""ClassContent"":{""Name"":""James"",""Age"":2}}";

dynamic jObj = JObject.Parse(json);
if (jObj.ClassType == "Class1")
{
    Console.WriteLine("{0} {1}", jObj.ClassContent.Name, jObj.ClassContent.Age);
}

由于返回一个对象(ClassContent)并不意味着什么,你必须以某种方式将它转换为一个具体的类(使用一些ifswitch)。

于 2013-07-25T12:37:05.433 回答
0

尝试以下

 var jsonObject = JObject.Parse(jsonString);

 var result = jsonObject.ToObject(Type.GetType("namespace.className"));
于 2015-02-10T12:06:05.223 回答
0

样本:

var container = JsonConvert.DeserializeObject<ContainerClass>(json);
JContainer content = (JContainer)container.ClassContent;

switch(container.ClassType)
{
    case "Class1": return container.ToObject(typeof(ClassOne));
    ..    
}
于 2013-07-25T12:36:12.247 回答
0

使用动态并调用 .ToObject(Type type)

dynamic root = JObject.Parse(json)
return root["ClassContent"].ToObject(Type.GetType(root["ClassType"]))
于 2013-07-25T13:13:05.657 回答