Sep132014
[转]Json.NET 反序列化 多层次 泛型 复杂对象 json(如List<>>)到数据实体对象
做了一天有关于JSON的工作,解析为JSON难度到不大,用.Net中微软自己的方法也很好用。
多层次泛型复杂对象(不是简单的 List>>)到数据实体对象,花了大半天时间从下午到晚上,一直研究到快凌晨。。。
最后还是放弃微软的方法。使用了 Json.NET 的 Newtonsoft.Json.dll 来反序列化。
随便推荐一个网站: 在线JSON校验格式化工具(K JSON) – json解析,json格式化,json 在线校验 http://www.kjson.com/
可以把要反解析的json放进去效验一下,避免错误格式,比如我今天遇到几次收到的 json 压根就是格式不正确的json … 非常耽误时间
下面给个例子供参考:
( 例子是在Handler1.ashx中做的,首先引用 “using Newtonsoft.Json;”)
using System; using System.Collections.Generic; using System.Web; using System.IO; using Newtonsoft.Json; namespace WebApp1 { /// <summary> /// Handler1 的摘要说明 /// </summary> public class Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { string strJson = @"{ 'success': true, 'Object': { 'ID': -1, 'MoveID': 'D09-242', 'EX_Unit': 00, 'In_Unit': 00, 'Remark': 'OK', 'Detail': [ { 'ID': 1, 'M_ID': null, 'DVID': '11', 'DVName': 'aa0', 'DVType': null }, { 'ID': 2, 'M_ID': null, 'DVID': '22', 'DVName': 'aa1', 'DVType': null }, { 'ID': 3, 'M_ID': null, 'DVID': '33', 'DVName': 'aa2', 'DVType': null } ] }, 'msg': '成功' }"; ///大{}内 JSONObject 数据, 最外层 JSONObject<MoveInfo<MoveDetailInfo>> obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JSONObject<MoveInfo<MoveDetailInfo>>>(strJson); string msg = obj.msg; string success = obj.success.ToString(); ///'Object'是实体对象类"MoveInfo"的实体类的数据 MoveInfo<MoveDetailInfo> info = obj.Object; int Mv_id1 = info.ID; //可以直接赋值给MoveInfo的对象获取到值 int Mv_id2 = obj.Object.ID; //还可以用上层的Object.ID获取到值 ///info.Detail 或 obj.Object.Detail 都是实体对象类"MoveDetailInfo"的实体类的数据 string DVName1 = ""; string DVName2 = ""; string DVName3 = ""; DVName1 = obj.Object.Detail[0].DVName; //方法1: 从最上次对象实体中取子属性 foreach(MoveDetailInfo mvinfo in info.Detail) DVName2 += mvinfo.DVName; //方法2: 迭代上层 info.Detail 对象"MoveDetailInfo"获取属性 MoveDetailInfo dvinfo = info.Detail[0]; DVName3 = dvinfo.DVName; //方法3: 再赋值给MoveDetailInfo对象类后获取 context.Response.ContentType = "text/plain"; context.Response.Write(string.Format("0;{0}\r1:{1};\r2:{2};", DVName1, DVName2, DVName3)); } public bool IsReusable { get { return false; } } } public class JSONObject<T> { private bool _success; /// <summary> /// 是否成功 /// </summary> public bool success { get { return _success; } set { _success = value; } } private T _Object; /// <summary> /// 业务实体对象 /// </summary> public T Object { get { return _Object; } set { _Object = value; } } private string _msg; /// <summary> /// 消息 /// </summary> public string msg { get { return _msg; } set { _msg = value; } } } /// <summary> /// MoveInfo 调拨单 /// </summary> public class MoveInfo<T> { private int _ID; public int ID { get { return _ID; } set { _ID = value; } } private string _MoveID; public string MoveID { get { return _MoveID; } set { _MoveID = value; } } private int _EX_Unit; public int EX_Unit { get { return _EX_Unit; } set { _EX_Unit = value; } } private int _In_Unit; public int In_Unit { get { return _In_Unit; } set { _In_Unit = value; } } private List<MoveDetailInfo> _Detail; public List<MoveDetailInfo> Detail { get { return _Detail; } set { _Detail = value; } } } /// <summary> /// 调拨明细信息 /// </summary> public class MoveDetailInfo { private int _ID; public int ID { get { return _ID; } set { _ID = value; } } private string _M_ID; public string M_ID { get { return _M_ID; } set { _M_ID = value; } } private string _DVID; public string DVID { get { return _DVID; } set { _DVID = value; } } private string _DVName; public string DVName { get { return _DVName; } set { _DVName = value; } } private string _DVType; public string DVType { get { return _DVType; } set { _DVType = value; } } } }