问题描述
json字符串:{"root":[{"name":"名字1","id":1},{"name":"名字2","id":2}]}
类:publicclassCModel{publicstringname{get;set;}publicintid{get;set;}}
用DataContractJsonSerializer或Newtonsoft.Json反序列化,忽略根节点root反序列化为CModel[]数组,要怎么做?
解决方案
本帖最后由 newlju 于 2016-05-26 00:18:13 编辑
解决方案二:
遍历生成数组
解决方案三:
哪里有什么根节点?分明就是一个名字叫root的集合publicclassObjList{publicList<CModel>root{get;set;}}publicclassCModel{publicstringname{get;set;}publicintid{get;set;}}
解决方案四:
引用2楼xuanbg的回复:
哪里有什么根节点?分明就是一个名字叫root的集合publicclassObjList{publicList<CModel>root{get;set;}}publicclassCModel{publicstringname{get;set;}publicintid{get;set;}}
就是不想定义二个类,而且root的不固定.可能是root1也可能是base等等,我需要直接从序列化出根层后的内容
解决方案五:
头尾去掉不就行了intstart=json.IndexOf('[');intend=json.LastIndexOf(']');json=json.SubString(start,end-start+1);
解决方案六:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingNewtonsoft.Json;usingNewtonsoft.Json.Linq;usingSystem.Text.RegularExpressions;namespacejsonTest{classProgram{staticvoidMain(string[]args){//定义一个JSON字符串stringjsonText="{"root":[{"name":"名字1","id":1},{"name":"名字2","id":2}]}";//jsonText="[{'name':'名字1','id':1},{'name':'名字2','id':2}]";//这样的json也可以接受jsonText=Regex.Replace(jsonText,@".*([.+]).*",x=>x.Groups[1].Value);//用正则去掉数组外的内容//反序列化JSON字符串JArrayja=(JArray)JsonConvert.DeserializeObject(jsonText);foreach(varoinja)//o是JObject类型{Console.WriteLine("id:{0}name:{1}",o["id"],o["name"]);}Console.ReadKey();}}}
解决方案七:
引用4楼shingoscar的回复:
头尾去掉不就行了intstart=json.IndexOf('[');intend=json.LastIndexOf(']');json=json.SubString(start,end-start+1);
别瞎整啊。万一人家root里边也有数组,或者人家那么里边也有]符号怎么办呢?不能抠字眼儿的时候,千万不要用这种简单匹配字眼儿的做法。
解决方案八:
里边-->前边引用3楼newlju的回复:
就是不想定义二个类,而且root的不固定.可能是root1也可能是base等等,我需要直接从序列化出根层后的内容
如果你收到的数据根本没有模式,你怎么知道你的数组是在root还是root1里边呢?Newtonsoft可以反序列化为JObject、JArray等等token,具有一套.netjson模型类型。不过所谓灵活的json对象模式,应该只是用来处理它最合适做的事情。你不应该在你原本应该事先知道root还是root1的时候还假装不知道啊。
解决方案九:
或者人家那么里边也有]符号怎么办呢-->或者人家name字段里边也有]符号怎么办呢如果你需要自己进一步写解析程序,那么就是用灵活的json对象类型模式。如果你需要直接进行业务逻辑处理,那么就倾向于强类型地编程。一般来说,跟一个靠谱的软件公司合作搞开发,这个“根节点”的名字是不会随便改变其含义的,是会特意写文档、最先定义好的。
解决方案十:
不想额外定义一个封装类的话,就你的例子那你可以简单的用Dictionary<string,List<CModel>>来反序列化
解决方案十一:
引用6楼sp1234的回复:
Quote: 引用4楼shingoscar的回复:
头尾去掉不就行了intstart=json.IndexOf('[');intend=json.LastIndexOf(']');json=json.SubString(start,end-start+1);别瞎整啊。万一人家root里边也有数组,或者人家那么里边也有]符号怎么办呢?不能抠字眼儿的时候,千万不要用这种简单匹配字眼儿的做法。
如果是root外面有数组你这样还好说,里面有又不影响end赋值用的是LastIndexOf,不是IndexOf
解决方案十二:
引用3楼newlju的回复:
Quote: 引用2楼xuanbg的回复:
哪里有什么根节点?分明就是一个名字叫root的集合publicclassObjList{publicList<CModel>root{get;set;}}publicclassCModel{publicstringname{get;set;}publicintid{get;set;}}就是不想定义二个类,而且root的不固定.可能是root1也可能是base等等,我需要直接从序列化出根层后的内容
那你不如直接序列化成一个CModel集合好了,干嘛还要外面封个root呢?json又没有规定必须有根节点