是否可以将 json 反序列化为 dynamic 对象?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以将 json 反序列化为 dynamic 对象?相关的知识,希望对你有一定的参考价值。

咨询区

  • jswanson

是否有方法可以将 json 反序列化为 dynamic 对象,如果可以实现的话,那我就可以省去很多冗余类。

回答区

  • Tom Peplow

如果你用 Json.NET 的话,那就非常简单了。


dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

除了直接反序列化,你还可以使用 Newtonsoft.Json.Linq,参考如下代码:


dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

更多详细内容,参见:http://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm

  • RoJaIt

我使用 http://json2csharp.com/ 生成了一个表示 json 结构的类。

  1. input:


{
   "name":"John",
   "age":31,
   "city":"New York",
   "Childs":[
      {
         "name":"Jim",
         "age":11
      },
      {
         "name":"Tim",
         "age":9
      }
   ]
}

  1. Output:


public class Child
{
    public string name { get; set; }
    public int age { get; set; }
}

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
    public string city { get; set; }
    public List<Child> Childs { get; set; }
}

然后我使用 Newtonsoft.Json 去实现反序列化类。


using Newtonsoft.Json;

namespace GitRepositoryCreator.Common
{
    class JObjects
    {
        public static string Get(object p_object)
        {
            return JsonConvert.SerializeObject(p_object);
        }
        internal static T Get<T>(string p_object)
        {
            return JsonConvert.DeserializeObject<T>(p_object);
        }
    }
}

然后你就可以像下面这样调用了。


Person jsonClass = JObjects.Get<Person>(stringJson);

string stringJson = JObjects.Get(jsonClass);

PS: 如果你的 JSON 变量不是一个有效的C#名,可以用下面的变通方法。


public class Exception
{
   [JsonProperty(PropertyName = "$id")]
   public string id { get; set; }
   public object innerException { get; set; }
   public string message { get; set; }
   public string typeName { get; set; }
   public string typeKey { get; set; }
   public int errorCode { get; set; }
   public int eventId { get; set; }
}

点评区

果然有 json 的地方就有 Json.NET,这么????的功能,我也是在去年才了解到,学习了。

以上是关于是否可以将 json 反序列化为 dynamic 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON (snake_case) 反序列化为动态 (PascalCase)?

将 JSON 反序列化为现有对象 (Java)

使用 Json.net 将 JSON 对象反序列化为动态对象

如何将java对象序列化/反序列化为javax.JSON

通过 RestKit 将 JSON 的本地 NSString 反序列化为对象(无网络下载)

Json.NET:反序列化嵌套字典