〇、前言

在日常开发中,对于 Json 的使用还是比较频繁的,特别是 Json 对象和字符串或者实体对象之间的转换。

虽然几乎天天用,但是总是感觉没那么明了,今天结合微软的 Newtonsoft.Json.Linq 类,试着详解一下,把相关的内容列一下。

一、Newtonsoft.Json.Linq 的层级结构

简单画个图,肯定比语言描述更清晰:

下面是层级结构中各个类的关系,以及都实现了哪些接口,通过查看他们实现的接口,就可知它的功能属性等:

// 最高级 JToken
public abstract class JToken : IJEnumerable<JToken>,
IEnumerable<JToken>, IEnumerable, IJsonLineInfo, ICloneable,
IDynamicMetaObjectProvider { }
// JContainer 二级
public abstract class JContainer : JToken,
IList<JToken>, ICollection<JToken>, IEnumerable<JToken>,
IEnumerable, ITypedList, IBindingList, IList, ICollection,
INotifyCollectionChanged { }
// 三级
public class JArray : JContainer, IList<JToken>,
ICollection<JToken>, IEnumerable<JToken>, IEnumerable { }
public class JConstructor : JContainer { }
public class JObject : JContainer, IDictionary<string, JToken>,
ICollection<KeyValuePair<string, JToken>>, IEnumerable<KeyValuePair<string, JToken>>,
IEnumerable, INotifyPropertyChanged, ICustomTypeDescriptor, INotifyPropertyChanging { }
public class JProperty : JContainer { }
// JValue 二级
public class JValue : JToken, IEquatable<JValue>,
IFormattable, IComparable, IComparable<JValue>, IConvertible { }
// 三级
public class JRaw : JValue { }
// IEnumerable:接口,用于表示【可枚举】的集合类型。
// IJsonLineInfo:接口,它提供了一种【获取 JSON 数据行号和位置信】息的方式,以便于处理和调试 JSON 数据
// ICloneable:接口,提供了一种标准的方式来支持对象的【浅拷贝】操作。通过实现该接口,可以为自定义类添加克隆功能,使得可以创建当前对象的副本,并在需要时进行相关操作
// IDynamicMetaObjectProvider:接口,可以【创建自己的动态对象】,并对其行为进行【灵活的定制】。这在一些需要动态生成或扩展属性的场景中非常有用,例如在运行时根据用户输入创建对象的属性。动态对象是指在运行时可以动态地添加、删除和修改属性的对象
// ICollection:接口,是一个泛型集合接口,它定义了一组操作来【管理和操作集合中的元素】。该接口提供了对集合进行添加、删除、查找和枚举等常见操作的统一方式
// ITypedList:接口,可以为自定义类型提供更精确的元数据信息,从而在数据绑定过程中提供更好的支持。这使得能够更灵活地使用数据绑定技术,并能够处理和显示更复杂的数据结构
// IBindingList:接口,可以使集合数据源具备更丰富的功能,如支持排序、过滤、搜索等。这样,在进行数据绑定时,可以更灵活地控制和管理集合的数据,并能够及时地通知绑定控件进行更新
// INotifyCollectionChanged:接口,提供了一种标准化的方式来通知集合的变化,使得可以更方便地处理集合的增删改操作,并及时更新相关的界面
// ICustomTypeDescriptor:接口,提供了一种扩展和自定义对象元数据信息的方式,使得能够更灵活地处理数据绑定和界面显示的需求
// IEquatable:接口,提供了一种标准化的方式来实现对象的【相等性比较】,使得可以根据特定的需求定义对象的相等性逻辑,从而更准确地判断两个对象是否相等
// IFormattable:接口,提供了一种标准化的方式来实现对象的【格式化输出】,使得可以根据特定的需求自定义对象的输出格式,从而更灵活地处理对象转换为字符串的操作
// IComparable:接口,用于比较对象的【大小关系】
// IConvertible:接口,用于将对象【转换为其他数据类型】

详情可参考:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JToken.htm

三、各个类型的数据格式和简单用法

JToken
// 以下两种写法都可以被转换为 JToken 类型
string jtokenstring1 = "\"Hello World\"";
string jtokenstring2 = "{\"name\":\"John\",\"age\":30}";
JToken jtoken1 = JToken.Parse(jtokenstring1);
JToken jtoken2 = (JToken)JsonConvert.DeserializeObject(jtokenstring2);
JObect
// 只能序列化标准的 json 字符串
string jobjstring2 = "{\"name\":\"John\",\"age\":30}";
JObject jobj1 = JObject.Parse(jtokenstring2);
JObject jobj2 = (JObject)JsonConvert.DeserializeObject(jtokenstring2);
JArray
// 以下两种写法都可解析
// 主要标识就是字符串两段是中括号
string jarraystring1 = "[\"value1\",\"value2\"]";
string jarraystring2 = "[{\"name\":\"John\",\"age\":30},{\"name\":\"Bob\",\"age\":20}]";
JArray jarray1 = JArray.Parse(jarraystring2);
JArray jarray2 = (JArray)JsonConvert.DeserializeObject(jarraystring2);
JProperty
// 创建一个 JProperty 的对象,然后转成字符串值
string propertyname = "name";
string propertyvalue = "John";
JProperty jproperty = new JProperty(propertyname, propertyvalue);
var jp = jproperty.ToString(); // 结果:"name": "John" // 但是通过这个输出的格式进行序列化时,就会提示异常,如下:
string jpropertystring1 = "\"name\": \"John\"";
// Newtonsoft.Json.JsonReaderException:Additional text encountered after finished reading JSON content
var jProperty1 = JProperty.Parse(jpropertystring1);
var jProperty2 = (JProperty)JsonConvert.DeserializeObject(jpropertystring1); // 下面将 jproperty 对象加入 JObject
JObject jobject = new JObject(); // 将 JProperty 添加到 JObject 中
jobject.Add(jproperty);
string jsonstring = jobject.ToString(); // 将 JObject 转换为字符串
Console.WriteLine(jsonstring);
// 输出:{\r\n \"name\": \"John\"\r\n}
JValue
JObject jsonObject = JObject.Parse("{\"a\":10,\"b\":\"Hello World\",\"c\":10}");
// 获取值信息
JValue jvaluea = (JValue)jsonObject["a"];
JValue jvalueb = (JValue)jsonObject["b"];
JValue jvaluec = (JValue)jsonObject["c"];
// JValue 两个实例比较
Console.WriteLine("jvaluea.Equals(jvalueb): " + jvaluea.Equals(jvalueb)); // false
Console.WriteLine("jvaluea.Equals(jvaluec): " + jvaluea.Equals(jvaluec)); // true
Console.WriteLine("jvaluea==jvaluec: " + (jvaluea == jvaluec)); // false
Console.WriteLine("jvalueb: " + jvalueb); // Hello World
int intValue = jvaluea.Value<int>(); // 将值转换为整数类型
Console.WriteLine("Integer value: " + intValue);

四、相关类型转换

4.1 Json 对象转字符串

// 测试一下
JObject jsonobject = JObject.Parse("{\"a\":10,\"b\":\"Hello World\",\"c\":10}");
string jsonobjectstr = ObjectToJsonstr(jsonobject);
Console.WriteLine("jsonobjectstr:" + jsonobjectstr); JValue jvalue = (JValue)jsonobject["b"];
Console.WriteLine("jvalue:" + jvalue);
string jvaluestr = ObjectToJsonstr(jvalue);
Console.WriteLine("jvaluestr:" + jvaluestr); JArray jsonarray = JArray.Parse("[{\"a\":10,\"b\":\"Hello World\",\"c\":10}]");
string jsonarraystr = ObjectToJsonstr(jsonarray);
Console.WriteLine("jsonarraystr:" + jsonarraystr); // 将 Json 对象转换成字符串格式
public static string ObjectToJsonstr(this object obj)
{
if (obj == null)
return null;
return JsonConvert.SerializeObject(obj);
}

4.2  json 字符串转 Json 对象

// 以下是将字符串转成三种对象的方法,写法相同
JObject jo = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(strjson);
JToken jo = (JToken)Newtonsoft.Json.JsonConvert.DeserializeObject(strjson);
JArray jo = (JArray)Newtonsoft.Json.JsonConvert.DeserializeObject(strjson);

4.3 json 字符串转实体对象 T

// 测试一下
string jsonobject = "{\"name\":\"张三\",\"code\":\"1001\"}";
var person = JsonstrToObject<Person>(jsonobject); public static T JsonstrToObject<T>(this string input)
{
try
{
return JsonConvert.DeserializeObject<T>(input);
}
catch (Exception ex)
{
return default(T);
}
}

4.4 实体对象转 Json 对象

Person person = new Person() { name = "张三", code = "1001" };
var personobj = Json_Object.TObjectToJsonobj<Person>(person);
string name = personobj["name"].ToString(); class Person
{
public string name { get; set; }
public string code { get; set; }
} public static JObject TObjectToJsonobj<T>(T data)
{
try
{
JToken jtoken = JToken.FromObject(data);
// 【JObject】
// JObject jobject = JObject.FromObject(data);
// 【JArray】是数组,因此仅针对对象集合 List<T>
// List<T> datas = new List<T>();
// datas.Add(data);
// JArray jarray = JArray.FromObject(datas);
return jobject;
}
catch
{
return null;
}
}

Json 基于类 Newtonsoft.Json.Linq.JToken 的应用简介【C# 基础】的更多相关文章

  1. [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类

    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...

  2. Newtonsoft.Json高级用法DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET即Newtonsoft.Json datatable,dataset,modle,序列化

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而 ...

  3. C# Json 序列化和反序列化 工具类 Newtonsoft.Json.dll

    引用: Newtonsoft.Json.dll // 引用: using Newtonsoft.Json; using Newtonsoft.Json.Converters; // 定义 实体测试类 ...

  4. c#操作json数据使用newtonsoft.json

    开源项目提供的一个读取示例 using System; using System.Collections.Generic; using System.IO; using System.Linq; us ...

  5. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  6. 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具

    ASP.Net MVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer.性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应 ...

  7. C#将对象转换成JSON字符串,Newtonsoft.Json (JSON.NET)

    官方API说明文档 http://www.newtonsoft.com/json/help/html/N_Newtonsoft_Json.htm http://www.newtonsoft.com/ ...

  8. IOS自带json解析类解析json

    - (IBAction)test:(id)sender { NSString *result = @"{\"code\":\"S00000\",\&q ...

  9. (转载)Newtonsoft.Json使用总结

    Newtonsoft.Json使用总结 初识JSON.......................................................................... ...

  10. .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

    JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...

随机推荐

  1. 2020-10-31:java中LinkedTransferQueue和SynchronousQueue有什么区别?

    福哥答案2020-11-01:SynchronousQueue:线程A使用put将数据添加到队列,如果没有其他线程使用take去获取数据,那么线程A阻塞,直到数据被其他线程获取,同理 如果线程B从队列 ...

  2. 2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。

    2021-04-04:给定一个非负数组arr,和一个正数m. 返回arr的所有子序列中累加和%m之后的最大值. 福大大 答案2021-04-04: 自然智慧即可. 1.递归,累加和. 2.动态规划,累 ...

  3. 给你安利一款国产良心软件uTools

    前言 大家好,我是xiezhr 最近由于换了新电脑,也是在各种折腾搭建开发环境,安装各种常用软件.今天呢给大家安利一款你可能没用过的国产良心软件uTools,这也是我刚刚拿到电脑后安装的第一款软件吧. ...

  4. AI DevOps | ChatGPT 与研发效能、效率提升(中)

    为啥 ChatGPT 突然火了? 简单概括就是:产品太过惊艳,体验超预期 之前人工智能发展多年,报道最多的也许就是曾经的李世石大战AlphaGo,现实中的特斯拉自动驾驶,还有波士顿动能放出的机器狗.对 ...

  5. SQL Server:User, group, or role 'iemis' already exists in the current database.

    --最新的解决方法 --先创建用户帐户,不进行授权,然后通过下面的SQL语句将该用户帐户关联至对应的数据库用户.优点是避免了重新授权的操作. USE tempdbEXEC sp_change_user ...

  6. Python-3.10安装步骤

    下载地址: https://www.python.org/ftp/python/3.10.4/python-3.10.4-amd64.exe 安装:   C:\Users\liujun>pyth ...

  7. Linux搭建FTP服务

    欢迎来到千汐   博客名称:千秋云染博客网址:https://www.cnblogs.com/skyrainmom 寄语:在混乱不堪的世界里你只管前行,时间替会证明一切 world cookie He ...

  8. web自动化08-下拉选择框、弹出框、滚动条

    1.下拉选择框操作 下拉框就是HTML中<select>元素:   先列需求: 需求:使用'注册A.html'页面,完成对城市的下拉框的操作 1).选择'广州' 2).暂停2秒,选择'上海 ...

  9. Kubernetes 证书详解(鉴权)

    Kubernetes 证书详解(鉴权) 简介 上一篇 系统分析了 Kubernetes 集群中每个证书的作用和证书认证的原理.对于 Kube-apiserver,Kubelet 来说,它们都能提供 H ...

  10. Java工具类Result<T>

    枚举类:ResultCodeEnum /** * 统一返回结果状态信息类 * */ @Getter public enum ResultCodeEnum { SUCCESS(200,"成功& ...