C#中Json字符串的各种应用类实例讲解
在程序中任何事物及信息都可以用对象进行描述和承载,除了比较流行的xml之外,还有一种简洁快速处理目标信息的形式那就是json格式。
首先json格式有自己固定的格式:例如person这个对象就可以简单的表示成{"name":"xxxx","age":12,"sex":"男"}形式。
json格式的描述如下:先用{}包含需要表达的对象信息,在{}里使用propertyname:value进行对象属性的描述,同时json字符串可以实现多层嵌套。例如:json数据:[{propertyname:value,propertyname:value},{propertyname:value,propertyname:value}],json嵌套格式:{propertyname:value,propertyname:{propertyname:value,propertyname:value}},理论上可以无限嵌套,但是这里建议嵌套最好不要超过3层。
对json格式有了了解之后,那我们如何在c#中使用json以及将已经实现的对象与json联系起来。先个给出几个命名空间
using newtonsoft.json;
using system.runtime.serialization;
using system.servicemodel;
using newtonsoft.json.linq;
using system.io;
using system.runtime.serialization.json;
这里需要注意的是 这些命名空间在 .net3.5及以上本版支持,同时必须在引用中添加 system.runtime.serialization.dll的引用。
这里主要使用到的类如下:
jsonserializer ,stringwriter,stringreader ,jsonwriter,jsonconvert, datacontractjsonserializer。
1.实现自定义类与json进行相互转化处理:
public class person { public person() { } public person(string name, string sex, int age, string address, personcharacter character) { this.name = name; this.sex = sex; this.age = age; this.address = address; this.character = character; } public string name { get; set; } public string sex { get; set; } public int age { get; set; } public string address { get; set; } public personcharacter character { get; set; } } public class personcharacter { public string daode { get; set; } public string wenhua { get; set; } public string xiuyang { get; set; } } public void showconvert() { person person = new person("lanar", "男", 24, "陕西", new personcharacter()); jsonserializer serializer = new jsonserializer(); stringwriter sw = new stringwriter(); serializer.serialize(new jsontextwriter(sw), person ); console.writeline(sw.getstringbuilder().tostring()); stringreader sr = new stringreader(@"{""name"":""ppp"", ""age"":"12"}"); person p1 = (project)serializer.deserialize(new jsontextreader(sr), typeof(person)); console.writeline(p1.name+ "=>" + p1.age); }
2. 契约方式:使用system.runtime.serialization.dll提供的datacontractjsonserializer或者 jsonreaderwriterfactory实现
public class person { public person() { } public person(string name, string sex, int age, string address, personcharacter character) { this.name = name; this.sex = sex; this.age = age; this.address = address; this.character = character; } [datamember] public string name { get; set; } [datamember] public string sex { get; set; } [datamember] public int age { get; set; } [datamember] public string address { get; set; } [datamember] public personcharacter character { get; set; } } public class personcharacter { public string daode { get; set; } public string wenhua { get; set; } public string xiuyang { get; set; } } public void showconvert() { person person = new person("许展鹏", "男", , "陕西", new personcharacter()); person p = new person() { name = "四大圣地", age = , sex = "男", character = new personcharacter() { daode="sds", wenhua="dasd", xiuyang="zzz"} }; datacontractjsonserializer serializer = new datacontractjsonserializer(p.gettype()); string jsontext; try { using (memorystream stream = new memorystream()) { serializer.writeobject(stream, p); jsontext = encoding.utf.getstring(stream.toarray()); console.writeline(jsontext); } using (memorystream ms = new memorystream(encoding.utf.getbytes(jsontext))) { datacontractjsonserializer serializer = new datacontractjsonserializer(typeof(person)); person p = (person)serializer.readobject(ms); } } catch (exception ex ) { throw new exception(ex.message,ex); } }
使用契约方式必须在类及相关的属性添加相关的契约修饰符: [datacontract], [datamember] 内嵌的对象内部可以不用添加契约修饰符号的。
以上只是最常用的应用方式,对于有特殊需求的实现可以使用第三方实现的json转换类进行处理。在web页面可以使用 引入system.web.script.serialization命名空间使用 javascriptserializer类实现简单的序列化。
上一篇: Jenkins的制品管理