做了一天有关于JSON的工作,解析为JSON难度到不大,用.Net中微软自己的方法也很好用。
多层次泛型复杂对象(不是简单的 List<T> 而是 List<<List<T>>>)到数据实体对象,花了大半天时间从下午到晚上,一直研究到快凌晨。。。
最后还是放弃微软的方法。使用了 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; }
}
}
}
参考文章 :
.net泛型在序列化、反序列化JSON数据中的应用 http://www.cnblogs.com/jdmei520/archive/2009/09/19/1569600.html
C# 将javascript的JSON反序列化为数组,泛型List,对象 – http://hi.baidu.com/jiang_yy_jiang/item/c32aff05bcce12ca915718e8