json数组如上图所示,我使用了以下方法,但是不对,请高手指点。
string str = GopAPI.SendInfo(value2); //这个结果集为上图json内容 JsonTextParser parser = new JsonTextParser(); JsonObjectCollection obj = parser.Parse(str) as JsonObjectCollection; JsonUtility.GenerateIndentedJsonText = false; string stocks = obj["stocks"].GetValue().ToString(); //这里获取的stocks一直为System.Collections.Generic.List`1[System.Net.Json.JsonObject] 而不是一个字符串 JavaScriptSerializer js = new JavaScriptSerializer(); List<Info> list = js.Deserialize<List<Info>>(stocks); //Info为我想转的类
报错内容为:
无效的 JSON 基元: System.Collections.Generic.List。
以下是我自己研究后的正确答案!
string str = GopAPI.SendInfo(value2);//得到json内容 //json转JavaScriptObject JavaScriptObject jObject = JavaScriptConvert.DeserializeObject(str) as JavaScriptObject; //获取json中key值为stocks的内容,转为JavaScriptArray JavaScriptArray list = jObject["stocks"] as JavaScriptArray; //自定义接口stocks内容的泛型Info List<Info> infolist = new List<Info>(); //遍历stocks内容 foreach (JavaScriptObject item in list) { //把JavaScriptObject转为自定义对象 Info m = (Info)JavaScriptConvert.DeserializeObject(JavaScriptConvert.SerializeObject(item), typeof(Info)); //把对象添加到泛型集合中 infolist.Add(m); }
非常不错!
stocks 是数组对象,并不是string,这样当然不行了.
JavaScriptSerializer js = new JavaScriptSerializer(); List<Info> list = js.Deserialize<List<Info>>(stocks); //Info为我想转的类
把 List<Info> 换成符合数据结构的对象,提取List<info>属性
JavaScriptSerializer js = new JavaScriptSerializer(); List<Info> list = js.Deserialize<定义的对象>(str).stocks;
其实这种方式我也考虑过,先把json整体序列化
string json = GopAPI.SendInfo(value2);//获取json JavaScriptSerializer js = new JavaScriptSerializer(); 对象 infos = js.Deserialize<对象>(json);
但是还是会报错如下,我觉得可能是json格式比较特殊引起的
数组的反序列化不支持类型“System.String”。
@imluzhi: 把你的自定义对象发出来看看,出现这问题十有八九是你的对象定义有问题
按照你的思路,必须反序列化两次。建议直接采用字符串截取,或者构造一个和你贴的json一样的数据格式,一次反序列化搞定。
嗯,我试过,但是错误也如我问题所属的那种:无效的 JSON 基元
问题在于我反序列化的时候,是不是存在什么问题,我自己都不明白了!
方法一: string str = GopAPI.SendInfo(value2); //json值 string[] s = str.ToString().Split('['); //分割1 string[] v = s[1].Split(']'); //分割2 JavaScriptSerializer js = new JavaScriptSerializer(); List<Info> infos = js.Deserialize<List<Info>>(v[0]);//这里报错内容为:无效的 JSON 基元 方法二: string str = GopAPI.SendInfo(value2); //json值 JsonTextParser parser = new JsonTextParser(); JsonObjectCollection obj = parser.Parse(str) as JsonObjectCollection; JsonUtility.GenerateIndentedJsonText = false; string stocks = obj["stocks"].GetValue().ToString(); JavaScriptSerializer js = new JavaScriptSerializer(); List<Info> infos = js.Deserialize<List<Info>>(str);//这里报错内容为:无效的 JSON 基元
这2种方法都是一种意思,问题在于反序列化那一步中,出现的问题
@imluzhi: 方式一中,你完全可以将v0,打印出来看看,是不是满足json格式。
方式二,你在ToString之后,stocks肯定不满足json格式,如果错误是必然的。
@幻天芒: 嗯,这个我已经理解了,但是错误原因是无效的JSON基元,这个问题我暂时还是没有找到解决方法,我看了下转换的类,数据结构是完全符合转换要求的,不知道你是否碰到过这种问题
@imluzhi: 建议使用Json.Net 或者FastJson、LitJson之类的进行测试。貌似自带的这个对json格式要求比较严格。
@幻天芒: 我先试试看吧,谢谢
不错!