【问题标题】:deserialize json into .net object using json.net使用 json.net 将 json 反序列化为 .net 对象
【发布时间】:2013-07-25 08:20:42
【问题描述】:

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

以下是有助于理解问题的 .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。我只是想知道如何根据ClassType 定义编写一些转换器来反序列化ClassContent。任何代码示例都将受到高度赞赏。

【问题讨论】:

    标签: c# .net serialization json.net deserialization


    【解决方案1】:

    试试下面的

     var jsonObject = JObject.Parse(jsonString);
    
     var result = jsonObject.ToObject(Type.GetType("namespace.className"));
    

    【讨论】:

      【解决方案2】:

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

      dynamic root = JObject.Parse(json)
      return root["ClassContent"].ToObject(Type.GetType(root["ClassType"]))
      

      【讨论】:

        【解决方案3】:

        我会去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) 没有多大意义,你必须以某种方式将它转换为一个具体的类(使用一些 if切换)。

        【讨论】:

          【解决方案4】:

          示例:

          var container = JsonConvert.DeserializeObject<ContainerClass>(json);
          JContainer content = (JContainer)container.ClassContent;
          
          switch(container.ClassType)
          {
              case "Class1": return container.ToObject(typeof(ClassOne));
              ..    
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多