包括XmlDocument/XDocument等等
我很开心,.NETCore终于来到了3.1LTS版本,并且将撑持3年,我们也筹备让部分业务迁移到3.1上面,不过很快我们就遇到了新的问题,就是对付Json序列化的选择;我本着清真的原则,既然选择迁移到3.1,一切都应该用官方标准或者建议方案。所以我们信心满满的选择了System.Text.Json。本文将会全面介绍System.Text.Json 和 Newtonsoft.Json 的不异和异同之处,便利需要的同学做迁移使用,对未来,我们连结等候。
文档对照 几个重要的东西在 System.Text.Json 中,有几个重量级的东西,所有的JSON互操纵,都是围绕这几个东西进行,只要理解了他们各自的用途用法,就根基上掌握了JSON和实体东西的互操纵。
JsonDocument供给用于查抄 JSON 值的布局内容,而不自动实例化数据值的机制。JsonDocument 有一个属性 RootElement,供给对JSON文档根元素的访谒,RootElement是一个JsonElement东西。
JsonElement供给对JSON值的访谒,在System.Text.Json 中,大到一个东西、数组,小到一个属性、值,都可以通过 JsonElement 进行互操纵
JsonPropertyJSON中最小的单元,供给对属性、值的访谒
JsonSerializer供给JSON互操纵的静态类,供给了一系列 Serializer/Deserialize 的互操纵的要领,此中还有一些异步/流式操纵要领。
JsonSerializerOptions与上面的 JsonSerializer 共同使用,供给自界说的本性化互操纵选项,包孕定名、枚举转换、字符转义、注释法则、自界说转换器等等操纵选项。
Utf8JsonWriter/Utf8JsonReader这两个东西是整个 System.Text.Json 的核心东西,所有的JSON互操纵几乎都是通过这两个东西进行,他们供给的高性能的底层读写操纵。
初始化一个简单的 JSON 东西在 System.Text.Json 中,并未供给像 JToken 那样非常便捷的创建东西的操纵,想要创建一个 JSON 东西,其过程是对照麻烦的,请看下面的代码,进行比拟
// Newtonsoft.Json.Linq; JToken root = new JObject(); root["Name"] = "Ron"; root["Money"] = 4.5; root["Age"] = 30; string jsonText = root.ToString(); // System.Text.Json string json = string.Empty; using (MemoryStream ms = new MemoryStream()) { using (Utf8JsonWriter writer = new Utf8JsonWriter(ms)) { writer.WriteStartObject(); writer.WriteString("Name", "Ron"); writer.WriteNumber("Money", 4.5); writer.WriteNumber("Age", 30); writer.WriteEndObject(); writer.Flush(); } json = Encoding.UTF8.GetString(ms.ToArray()); }System.Text.Json 的操纵便当性在这方面目前处于一个对照弱的状态,不过,从这里也可以看出,可能官方并不但愿我们去直接操纵 JSON 源,而是通过操纵实体东西以到达操纵 JSON 的目的,也可能对互操纵是性能对照自信的表示吧。
封装和加载在对JSON文档进行包装的用法
var json = "{\"name\":\"Ron\",\"money\":4.5}"; var jDoc = System.Text.Json.JsonDocument.Parse(json); var jToken = Newtonsoft.Json.Linq.JToken.Parse(json);我发明MS这帮人很喜欢使用 Document 这个词,包孕XmlDocument/XDocument等等。
查找元素(东西) var json = "{\"name\":\"Ron\",\"money\":4.5}"; var jDoc = System.Text.Json.JsonDocument.Parse(json); var obj = jDoc.RootElement[0];// 这里会报错,索引仅撑持 Array 类型的JSON文档 var jToken = Newtonsoft.Json.Linq.JToken.Parse(json); var name = jToken["name"];你看,到查找元素环节就浮现出差异了,JsonDocuemnt 索引仅撑持 Array 类型的JSON文档,而 JToken 则撑持 object 类型的索引(充塞想象),用户体验高下立判。
那我们不禁要提问了,如安在 JsonDocument 中查找元素?答案如下。
从上面的代码来看,JsonElement 存在两个迭代器,分袂是EnumerateArray和EnumerateObject;通过迭代器,你可以实现查找元素的需求。你看,MS关上了一扇门,然后又为了打开了一扇窗,还是很人性化的了。在System.Text.Json中,一切东西都是Element,Object/Array/Property,都是Element,这个观点和XML一致,但是和Newtonsoft.Json差别,这是需要注意的处所。
你也可以选择不迭代,直接获取东西的属性,好比使用下面的要领
var json = "{\"name\":\"Ron\",\"money\":4.5}"; var jDoc = System.Text.Json.JsonDocument.Parse(json); var age = jDoc.RootElement.GetProperty("age");上面这段代码将抛出异常,因为属性 age 不存在,凡是情况下,我们会当即想用一个 ContainsKey 来作一个判断,但是很可惜,JsonElement 并未供给该要领,而是供给了一个 TryGetProperty 要领;所以,除非你明确知道 json 东西中的属性,否则一般情况下,建议使用 TryGetProperty 进行取值。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32716.html