咨询区
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 结构的类。
input:
{"name":"John","age":31,"city":"New York","Childs":[{"name":"Jim","age":11},{"name":"Tim","age":9}]
}
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,这么????的功能,我也是在去年才了解到,学习了。