首页 > 编程语言 >Json 基于类 Newtonsoft.Json.Linq.JToken 的应用简介【C# 基础】

Json 基于类 Newtonsoft.Json.Linq.JToken 的应用简介【C# 基础】

时间:2023-08-11 19:23:53浏览次数:50  
标签:Newtonsoft string C# JArray 接口 JToken JObject Json

〇、前言

在日常开发中,对于 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;
    }
}

标签:Newtonsoft,string,C#,JArray,接口,JToken,JObject,Json
From: https://www.cnblogs.com/hnzhengfy/p/JObjectJArray.html

相关文章

  • wix中,传参给c#扩展的customAction的 使用笔记
    即时的CA不可回滚,但是能直接在c#里用session["属性名称"]访问上下文的属性如果是延迟执行的CA,需要通过customActionData<!--id需要一样--><CustomActionid="xxx"Execute="deferred"..../><PropertyId="xxx"Value="Arg1=111;Arg2=222;......
  • PyCharm 2023.2 删除无效的解释器Interpreters
    1.File中找到Settings2.在Settings里搜索interpreter3.点击ShowAll4.点击-即可......
  • WEB实战手册-基于C++(1)
    目录oat++oat++oat++是一个轻量级高性能Web服务开发框架,采用纯C++编写而成。特性:特性快速零依赖异步服务器,高性能,在单个服务器上同时处理超过500万个WebSocket连接多线程服务器(简单的API)连接无感知,可以使用任何传输类型,无论是SSL后端、套接字......
  • IIS8.5 Error Code 0x8007007e HTTP 错误 500.19的解决方法
    windowserver2012R2IIS8.5引用:https://www.52jbj.com/yunying/340443.htmlHTTP错误500.19-InternalServerError  无法访问请求的页面,因为该页的相关配置数据无效。    详细错误信息    模块DynamicCompressionModule    通知SendResponse    处......
  • WSL2 Cannot connect to the Docker daemon [已解决]
    如果你已经在网上找了很多方法了,那建议你再试试这个。1,进入WSL2,去除WSL1遗留的环境变量unsetDOCKER_HOST2,设置Docker-Desktop指定运行的wsl2环境,默认是docker-desktop3,再进入wsl看看吧,goodluck......
  • JScript 连接 ACCESS2010数据库
    vardb=newActiveXObject("adodb.connection");varret=db.Open("Provider=Microsoft.Ace.OLEDB.12.0;DataSource=D:\\Database11.accdb");varCommandText="insertintouser(id,name)values(100,'admin&......
  • ACCESS 禁止用户使用SHIFT启动数据库
    这是官方链接,不要去各种百度了: 在数据库中强制实施或禁用启动选项-Office|MicrosoftLearn'1.启动访问。'2.创建新模块,然后添加以下两个函数:Functionap_DisableShift()'Thisfunctiondisabletheshiftatstartup.Thisactioncauses'theAutoexecmacroandS......
  • 关于FFmpeg释放 AVFormatContext*解码上下文的一些问题
    关于FFmpeg释放AVFormatContext*解码上下文的一些问题FFmpeg的一些常用函数用途结构体释放解码上下文FFmpeg的一些常用函数用途av_register_all()注册所有组件。avformat_open_input()打开输入视频文件。avformat_find_stream_info()获取视频文件信息。avcodec_find_d......
  • C++欧几里得算法求最大公约数和最小公倍数
    定义最大公约数即为GreatestCommonDivisor,常缩写为gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数。一组整数的最大公约数,是指所有公约数里面最大的一个。那么如何求最大公约数呢?我们先考虑两个数的情况。欧几里得算法过程如果我们已知两个数\(a\)和\(......
  • 宝塔项目迁移到另外一个宝塔,访问出现错误No input file specified.解决方法
    1.PHP网站项目从测试的宝塔转移到正式的宝塔,项目转移后打开出现错误Noinputfilespecified,查询错误日志/www/wwwlogs/(自己网站的error日志)发现 查询了一下这个错误: 最终发现问题在public文件下的.user.ini 将路径修改为新网址,问题解决 ......