在C#中使用Json.Net进行序列化和反序列化及定制化
序列化(serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(deserialize)则是将上面的字节流转换为相应对象的过程;在.net阵营中,json.net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:;
一、将对象序列化为json格式字符串
首先是正常的序列化操作,对于给定的类:
private class myclass { public int mynum; public string mystr; }
将该类的实例序列化为json格式字符串,首先引用命名空间newtonsoft.json:
myclass myclass = new myclass { mynum = 10, mystr = "hello world" }; console.writeline(jsonconvert.serializeobject(myclass));
其打印结果:
{"mynum":10,"mystr":"hello world"}
在打印到本地log文件以供自己查看使用时,可以选择转换为带有缩进的json格式字符串:
console.writeline(jsonconvert.serializeobject(myclass, formatting.indented));
此时打印结果为:
{ "mynum": 10, "mystr": "hello world" }
二、将json格式字符串反序列化为对象
对于给定的字符串:
string jsonstr = @"{""mynum"": 10,""mystr"": ""hello world""}";
将其反序列化为myclass类型的对象:
myclass myclass = jsonconvert.deserializeobject<myclass>(jsonstr);
console.writeline(myclass.mystr); //hello world
三、使用jobject动态序列化/反序列化
以上例子都是使用强类型进行序列化和反序列操作,但有时也会用到不指定类型而直接操作json格式数据的情况,此时就需要用位于命名空间ewtonsoft.json.linq中的jobject类型的对象:
string jsonstr = @"{""mynum"": 10,""mystr"": ""hello world""}"; jobject jobject = jobject.parse(jsonstr); console.writeline(jobject.tostring(formatting.none)); //{"mynum":10,"mystr":"hello world"} //打印一条属性的值 console.writeline(jobject["mystr"].value<string>()); //hello world
//添加一条属性
jobject.add("mystr2", "haha");
//打印当前json字符串
console.writeline(jobject.tostring(formatting.none)); //{"mynum":10,"mystr":"hello world","mystr2":"haha"}
四、定制化序列化/反序列过程
1.在c#中,定制化的配置通常使用特性来完成,这里也不例外,例如简单的,在序列化/反序列时忽略某个字段/属性:
private class myclass { [jsonignore] public int mynum; public string mystr; }
此时,无论序列化还是反序化时,字段mynum都不再参与这些过程;
2.自定义某个字段/属性的序列化/反序列化规则:
当接收到的json格式字符串与本地已有类型不统一时,需要进行自定义的反序列化过程,反之亦然,例如json字符串中以字符串"true"表示布尔类型true(不自定义,这个过程依然走的通,只是以此举例),以字符串"false"表示布尔类型false时,需要自定义如下:
/// <summary> /// 自定义布尔类型数据转换规则 /// </summary> public class myboolconverter : jsonconverter { private const string truestr = "true"; private const string falsestr = "false"; public override bool canconvert(type objecttype) => true; //反序列化 public override object readjson(jsonreader reader, type objecttype, object existingvalue, jsonserializer serializer) { if (reader.valuetype == typeof(string)) { if ((string)reader.value == truestr) { return true; } else { return false; } } return false; } //序列化 public override void writejson(jsonwriter writer, object value, jsonserializer serializer) { if (value.gettype() == typeof(bool)) { bool result = (bool)value; if (result) { writer.writevalue(truestr); } else { writer.writevalue(falsestr); } } } }
然后,在需要操作的类型定义中的字段/属性中加入该特性:
private class myclass { [jsonconverter(typeof(myboolconverter))] public bool mybool; }
此时:
string jsonstr = @"{""mybool"": ""true""}"; myclass1 myclass = jsonconvert.deserializeobject<myclass1>(jsonstr); console.writeline(myclass.mybool); //true console.writeline(jsonconvert.serializeobject(myclass)); //{"mybool":"true"}
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!
作者:minotauros
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
下一篇: 抽象类、抽象方法