有个东西叫dynamic,你把JsonConvert.DeserializeObject(json)的返回值类型写成dynamic即可,然后这个类型的变量就可以像实体类一样点出来需要的对象,但是不会有提示,只要点出来的东西是真实存在的,就可以获取到值。
按你的意思,要取第二个Rows里的数据是这样:
string json = "{Tables:[{Rows:[[1,2,3]]},{Rows:[[4,5,6],[7,8,9],[10,11,12]]}]}"; dynamic jobj = JsonConvert.DeserializeObject(json); var n = jobj.Tables[1].Rows[1][1].Value;//这里取出来的是8
你要处理成什么样
我要取第二个Rows里面的每一行里面的数据。
{}代表对象[]代表数组,你想怎么用?
你这没体现什么问题。
额,以前都是处理成实体类调用json,但是这个格式,不知道怎么定义实体类了。
@BetterCoder: 这么jb简单会看不懂,这种都是格式化的东西,也根本不必人写。
给你个简单办法,你也不用写类了,直接jscript命名空间下的 反序列化 成 Dictionary<string,object>就行了。
感觉json的格式有问题呀,圈起来的部分应该是json对象(键值对形式)吧。
这种也是json,我校验过。
可以将tables下的rows转成实体
整个JSON对象只有一个属性叫Tables,名为Tables的属性是个数组,这个数组包含三个元素,这三个元素是结构相同的JSON对象,都只包含三个名为Rows的属性,而且它们都是一个数组,但这三个数组的结构不同。
第一个:[[,]]
第二个:[[,,,,,,,,,,,,,,,,] , ......]
第三个:[[,,,,,,]]
感觉这种不要用反序列化的方式。
那怎么用?难道截取字符串?
JObject.Parse(json)["Tables"][1]["Rows"]
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> rst = (Dictionary<string, object>)serializer.DeserializeObject(jsonData);
object[] rowsDataList = (object[])rst["Tables"];
foreach (object rowDataObj in rowsDataList)
{
Dictionary<string, object> rowsDataDic = (Dictionary<string, object>)rowDataObj;
object[] rowsDataLines = (object[])rowsDataDic["Rows"];
foreach (var rowsData in rowsDataLines)
{
object[] rowArrayData = (object[])rowsData;
Console.WriteLine(rowArrayData[1].ToString());
}
}
用VS2013以上,可以直接把JSON(XML)粘贴为实体类。