首页 新闻 会员 周边

asp.net 反序列化的问题

0
悬赏园豆:40 [已解决问题] 解决于 2015-01-29 10:32

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。

imluzhi的主页 imluzhi | 初学一级 | 园豆:37
提问于:2015-01-28 16:05
< >
分享
最佳答案
0

以下是我自己研究后的正确答案!

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);
}
imluzhi | 初学一级 |园豆:37 | 2015-01-29 09:35

非常不错!

幻天芒 | 园豆:37175 (高人七级) | 2015-01-29 11:15
其他回答(3)
0

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; 

收获园豆:20
garry | 园豆:495 (菜鸟二级) | 2015-01-28 16:28

其实这种方式我也考虑过,先把json整体序列化

string json = GopAPI.SendInfo(value2);//获取json
JavaScriptSerializer js = new JavaScriptSerializer();
对象 infos = js.Deserialize<对象>(json);

但是还是会报错如下,我觉得可能是json格式比较特殊引起的

数组的反序列化不支持类型“System.String”。

支持(0) 反对(0) imluzhi | 园豆:37 (初学一级) | 2015-01-28 16:37

@imluzhi: 把你的自定义对象发出来看看,出现这问题十有八九是你的对象定义有问题

支持(0) 反对(0) garry | 园豆:495 (菜鸟二级) | 2015-01-29 09:07
0

按照你的思路,必须反序列化两次。建议直接采用字符串截取,或者构造一个和你贴的json一样的数据格式,一次反序列化搞定。

收获园豆:20
幻天芒 | 园豆:37175 (高人七级) | 2015-01-28 16:34

嗯,我试过,但是错误也如我问题所属的那种:无效的 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种方法都是一种意思,问题在于反序列化那一步中,出现的问题

支持(0) 反对(0) imluzhi | 园豆:37 (初学一级) | 2015-01-28 16:46

@imluzhi: 方式一中,你完全可以将v0,打印出来看看,是不是满足json格式。

方式二,你在ToString之后,stocks肯定不满足json格式,如果错误是必然的。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-01-28 17:03

@幻天芒: 嗯,这个我已经理解了,但是错误原因是无效的JSON基元,这个问题我暂时还是没有找到解决方法,我看了下转换的类,数据结构是完全符合转换要求的,不知道你是否碰到过这种问题

支持(0) 反对(0) imluzhi | 园豆:37 (初学一级) | 2015-01-28 17:05

@imluzhi: 建议使用Json.Net 或者FastJson、LitJson之类的进行测试。貌似自带的这个对json格式要求比较严格。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-01-28 17:05

@幻天芒: 我先试试看吧,谢谢

支持(0) 反对(0) imluzhi | 园豆:37 (初学一级) | 2015-01-28 17:06
0

不错!

纵一苇之所如- | 园豆:187 (初学一级) | 2015-01-29 16:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册