永发信息网

C# JSON 反序列化

答案:2  悬赏:0  手机版
解决时间 2021-02-26 07:56
下面的JSON字符串要转为对象比较容易:
JSON字符串:{"A":0,"B":1,"C":0,"D":3}

[DataContract(Namespace = "XXX")]
public class MyClass
{
[DataMember(Order = 1)]
public int A { get; set; }
[DataMember(Order = 2)]
public int B { get; set; }
[DataMember(Order = 3)]
public int C { get; set; }
[DataMember(Order = 4)]
public int D { get; set; }
}

var ser = new DataContractJsonSerializer(typeof(MyClass));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(JSON字符串));
MyClass myClass1 = (MyClass)ser.ReadObject(ms);

运用以上代码即可成功转换.

问题是,像下边这样的JSON字符串该如何转换
JSON字符串:{"112":0,"325":1,"109":4}

这样是不可取的:
[DataContract(Namespace = "XXX")]
public class MyClass
{
[DataMember(Order = 1)]
public int 112 { get; set; }
[DataMember(Order = 2)]
public int 325 { get; set; }
[DataMember(Order = 3)]
public int 109 { get; set; }
}
因为C#中变量不能以数字开头,而且类似"112":0这样的项不是固定不变的,数量也不固定.试过用SortedList,但不能成功.请有经验的赐教一下.

不固定的意思是说:这一次是"112":0下一次可能就是"113":0或"234243":0等等,无法预知会来个什么.
数量不固定的意思是说:例子中只给出了3个,但也可能是3万个.

个人凭经验觉得这应该是一个字典类,因为字典类可以用任何字符串做KEY,可以容纳任意数量的项.

原来还有JavaScriptSerializer这东西
JavaScriptSerializer能支持SortedList
所以问题很简单就解决了,谢谢.

能否再给我上一课,说一下DataContractJsonSerializer与JavaScriptSerializer有什么区别,在哪种情况下选择哪个比较合理,有在网上搜了一下,都是英文的,看不大懂...
---------------------------
感谢【depluin】的解答:
……
DataContractJsonSerializer 可以处理其中的键类型不是字符串的词典,而 JavascriptSerializer 则无法处理,在这一方面前者的功能更为强大。但后者与 JSON 的兼容性更好。

====================================
可惜百度知道没有分配分数的功能,只能将分数给与其中一个,再次感谢两位的帮助!
最佳答案
不要用DataContract

var serialize = new JavaScriptSerializer();
var obj= serialize.Deserialize(str);

可以{"112":0,"325":1,"109":4}
str.Replace(",","},{");
"["+str+"]"
将Json对象转为HashTable再进行后序列化
全部回答
using system; using system.web.script.serialization; //需要添加对system.web.extensions的引用 namespace consoleapplication1 {     //定义一个与json格式对应的类     public class user     {         public string name { get; set; }         public string loginname { get; set; }         public guid id { get; set; }     }     class program     {         static void main(string[] args)         {             //问题中给出的不是标准的json格式             //修改如下:             string json = @"{'name':'系统管理员','loginname':'admin','id':'f2222447-146d-4767-b0b5-b19254c6bc05'}";             javascriptserializer js = new javascriptserializer();             //从json反序列化出一个user对象              user u = (user)js.deserialize(json, typeof(user));         }     } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
第一次去女朋友家,应该注意些什么,带点什么
俗话说“鱼儿离不开水”,鱼类具有的下列特征
小悦城的房子买行吗
美宜家我想知道这个在什么地方
汽车相撞,安全气囊要时速多少才能起作用
广州农商银行一天取现多少
淘宝买东西,因其他原因,退款。卖家不肯退运
家电耐用品折旧价格怎么算
C语言改错。
上街区怎么坐车到郸城县
灵台县水土保持局我想知道这个在什么地方
内衣穿着总是往上走
日什么夜什么
产品质量监督检验的依据有哪些?
成都老国药房郫县蜀仁东顺药房地址有知道的么
推荐资讯
为什么我如果很累很疲倦的话就头疼
【以金( )( )组个词要ABB类的】
儿童的发展
生活小妙招-如何让新鞋不夹脚
商登高速公路/兰南高速公路(路口)怎么去啊,
我是摩托车新手 怎么样启动到停车? 我刚才踩
oracle 11g r2 grid是干什么的
龙塘辅线/Y419(路口)这个地址在什么地方,我
生育险可以补助多少钱
豪门公寓地址在什么地方,想过去办事
“宅童”泛指不喜欢外出与朋友游玩,一个人呆
中国音乐学院钢琴考级的问题?如何选十级曲目
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?