C#使用Json.Net进行序列化和反序列化及定制化
序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程;在.Net阵营中,Json.Net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:https://www.newtonsoft.com/json;
一、将对象序列化为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"}
以上就是本次整理的C#使用Json.Net进行序列化和反序列化及定制化全部知识点内容,感谢大家对脚本之家的支持。
您可能感兴趣的文章:
- 在C#中使用Json.Net进行序列化和反序列化及定制化
- ASP.NET C#使用JavaScriptSerializer实现序列化与反序列化得到JSON
- .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值
- ASP.NET C#使用JavaScriptSerializer实现序列化与反序列化得到JSON
- [asp.net]C#实现json的序列化和反序列化
- [asp.net]C#实现json的序列化和反序列化
- .NET 3.5: 使用DataContractJsonSerializer进行JSON 序列化
- Asp.net C# 使用Newtonsoft.Json 进行通信
- 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值
- c#.net将对象序列化,反序列化json
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
- .Net——使用DataContractJsonSerializer进行序列化及反序列化基本操作
- .Net——使用DataContractJsonSerializer进行序列化及反序列化基本操作
- .NET 2.0 使用最新版的JSON.net 进行反序列化 【转载】
- 使用net.sf.json库进行json反序列化时存在的问题
- ASP.NET中JSON如何对时间进行序列化和反序列化
- C# 使用JSON对数据序列化和反序列化.
- [asp.net]C#实现json的序列化和反序列化
- 解决“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错”的问题
- [C#] 使用 DataContractJsonSerializer 序列化 反序列化