Json.net的序列化与反序列化
1、JSON格式,JSON就是javascript中的对象({key:value}的键值结构)和数组(["value",]的结构,其中value可以是数字、对象、数组等);
string response={"status":0,"total":1,
"items":[
{"KZRQ":"2009-04-23","JB":"采天然气井"},
{"KZRQ":"2009-04-23","JB":"采天然气井"}
]
}
2、反序列化JSON对象,并获取对象属性
//反序列化JOSN为JObject对象
var data = JsonConvert.DeserializeObject(response) as JObject;
//读取对象值
string total=data["total"].ToString(); 或 string total=(string)((dynamic)data).total;
数据值:data["items"].ToString();数组中对象:((dynamic)data).items[0].ToString();
3、反序列化至DataTable
DataTable dt = new DataTable();
dt.Columns.Add("JHBM", Type.GetType("System.String"));//井号
dt.Columns.Add("JX", Type.GetType("System.String"));//井型
dt.Columns.Add("JB", Type.GetType("System.String"));//井别
。。。。
string response = 上面的值;
var data = JsonConvert.DeserializeObject(response) as JObject;
if (data["total"].ToString() != "0")//另一种写法:
{
dt = JsonConvert.DeserializeObject<DataTable>(data["items"].ToString());
}
//反序列化写法
//JsonConvert.SerializeObject(dt)
注:datatable的字段要与json中的key相对应;反序列化则为
4、反序列化至Entity对象
首先定义实体类:
[DataContract]
public class WellInfo
{
[DataMember]
[JsonProperty(PropertyName = "JHBM")]//JsonPropertyj为自定义属性,与JSON中KEY对应
public string JH { get; set; }
[DefaultValue(10)]//默认值
[DataMember]
public string JK { get; set; }
[DataMember]
[JsonProperty(PropertyName = "JB")]
public string SJJB { get; set; }
[DataMember]
[JsonProperty(PropertyName = "JX")]
public string JX { get; set; }
}
反序列化如下:
var data = JsonConvert.DeserializeObject(response) as JObject;//序列化对象
var items_data = JsonConvert.DeserializeObject(data["items"][0].ToString());//获取数组第一个值
WellInfo w = JsonConvert.DeserializeObject<WellInfo>(items_data.ToString());
//返回Entity数组
var items_data = JsonConvert.DeserializeObject(data["items"].ToString());//获取数组第一个值
WellInfo w = JsonConvert.DeserializeObjectList<<WellInfo>>(items_data.ToString());
扩展:反序列化后为Jobject对象,属性为Jproperty
var data = JsonConvert.DeserializeObject(response) as JObject;//序列化对象
foreach(JProperty jp in JsonConvert.DeserializeObject(data["items"][0]))
{
sb.Append(String.Format(@"<span>{0}</span>:<span>{1}</span>",jp.Name,jp.Value));
}