Json 基于类 Newtonsoft.Json.Linq.JToken 的应用简介【C# 基础】
〇、前言
在日常开发中,对于 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 |
|
||||||||||||||||||||||||||||||||||||
JObect |
|
||||||||||||||||||||||||||||||||||||
JArray |
|
||||||||||||||||||||||||||||||||||||
JProperty |
|
||||||||||||||||||||||||||||||||||||
JValue |
|
四、相关类型转换
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; } }

本文来自博客园,作者:橙子家,欢迎微信扫码关注博主【橙子家czzj】,有任何疑问欢迎沟通,共同成长!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步