首页 > 其他分享 >Newtonsoft.Json 入门介绍

Newtonsoft.Json 入门介绍

时间:2023-11-13 18:02:35浏览次数:36  
标签:Newtonsoft 入门 JObject JArray JToken Json new jObj

本人是C#小白,这里摘抄并整理了两位大神的文章:

Newtonsoft.Json笔记 -JToken、JObject、JArray详解

Json 基于类 Newtonsoft.Json.Linq.JToken的应用简介

 

简单介绍如何使用Newtonsoft.Json类库和操作Json对象,这里主要介绍Linq to Json类。

Newtonsoft.Json封装类实现了JToken,直接对JSON进行增删改查的操作,很好的解决了动态解析json数据的问题,

JToken的层次结构是这样的:

JToken         -抽象基类
  JContainer     - 能够包含其它JTokenJToken抽象基类
    JArray     - 表示一个JSON数组(包含一个有序的List)
    JObeject    - 表示一个JSON对象(包含一个IEnumerable
    JProperty    - 表示一个JSON属性(在JObject中是一个name/JToken键值对)
  JValue      - 表示一个原生JSON值(string,number,boolean,null)

一,Linq to Json

使用Linq to Json前,需要引用Newtonsoft.Json的dll和using Newtonsoft.Json.Linq的命名空间。

Linq to Json主要使用到JObject, JArray, JProperty和JValue这四个对象,以及一个特殊的JToken对象。

  • JObject:基本的Json对象,用来生成一个JSON对象,简单来说就是生成”{}”,
  • JArray用来生成一个JSON数组,也就是”[]”,
  • JProperty用来生成一个JSON数据,格式为key/value的值,
  • 而JValue则直接生成一个JSON的Key的Value
  • JToken 用于存放Linq to JSON查询后的结果

1,创建JSON对象

JObject staff = new JObject();
staff.Add(new JProperty("Name", "Jack"));
staff.Add(new JProperty("Age", 33));
staff.Add(new JProperty("Department", "Personnel Department"));
staff.Add(new JProperty("Leader", new JObject(new JProperty("Name", "Tom"), new JProperty("Age", 44), new JProperty("Department", "Personnel Department"))));
Console.WriteLine(staff.ToString());

还可以通过以下方法创建Json对象:

方法说明
JObject.Parse(string json) json含有JSON对象的字符串,返回为JObject对象
JObject.FromObject(object o) o为要转化的对象,返回一个JObject对象

2,创建JSON数据

// 创建数组
JArray array = new JArray();
array.Add(new JValue("吃饭"));
array.Add(new JValue("睡觉"));
 
Console.WriteLine(array.ToString());

上面的代码可以简化为:

JArray array = new JArray("吃饭", "睡觉")

3,查询

举一个简单的例子:

string json = "{\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] }";
//将json转换为JObject
JObject jObj = JObject.Parse(json);
JToken ageToken =  jObj["Age"];
Console.WriteLine(ageToken.ToString());

二,使用JToken操作Json对象

1,查询

首先准备json字符串,是一个包含员工基本信息的json,并把字符串转换为JObject:

string json = "{\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] }";
//将json转换为JObject
JObject jObj = JObject.Parse(json);

获取员工的姓名:

//通过属性名或者索引来访问,仅仅是自己的属性名,而不是所有的
JToken ageToken =  jObj["Age"];
Console.WriteLine(ageToken.ToString());

获取员工的同事的姓名:"Children()"可以返回所有数组中的对象

var names=from staff in jObj["Colleagues"].Children()
                             select (string)staff["Name"];
foreach (var name in names)
         Console.WriteLine(name);

2,修改

 //将json转换为JObject
jObj["Age"] = 35;
Console.WriteLine(jObj.ToString());

修改Jack同事的年龄为45:

//将json转换为JObject
JObject jObj = JObject.Parse(json);
JToken colleagues = jObj["Colleagues"];
colleagues[0]["Age"] = 45;
jObj["Colleagues"] = colleagues;//修改后,再赋给对象
Console.WriteLine(jObj.ToString());

3,删除

//删除第一个同事
JObject jObj = JObject.Parse(json);
 jObj["Colleagues"][1].Remove();
Console.WriteLine(jObj.ToString());

//删除所有同事
JObject jObj = JObject.Parse(json);
 jObj.Remove("Colleagues");//跟的是属性名称
Console.WriteLine(jObj.ToString());

4,添加

//添加部门信息,必须添加在Age节点的后面
JObject jObj = JObject.Parse(json);
jObj["Age"].Parent.AddAfterSelf(new JProperty("Department", "Personnel Department"));
Console.WriteLine(jObj.ToString());


//添加新的同事
JObject jObj = JObject.Parse(json);
JObject linda = new JObject(new JProperty("Name", "Linda"), new JProperty("Age", "23"));
jObj["Colleagues"].Last.AddAfterSelf(linda);
Console.WriteLine(jObj.ToString());

5,汇总

var cardJson = "['身份证','银行卡','门禁卡']";
            var cardJArray = JArray.Parse(cardJson);
            var p = new Person { Name="fan",Age=12,Dog=new Dog { Name="奶牛"} };
        JObject jobj= JObject.FromObject(p);

//添加属性
            jobj["NickName"] = "fan";
            jobj["Wifes"] = new JArray("rose", "lisa");
            ((JArray)jobj["Wifes"]).Add( "july");
            jobj["Cards"] = cardJArray;
            //修改属性
            jobj["Name"] = "li";
            jobj["Age"] = 9;
            jobj["Dog"]["Name"] = "阿黄";
            ((JArray)jobj["Wifes"])[0] = "roses";
            //插入属性
            jobj.Property("Name").AddBeforeSelf(new JProperty("ID", 1));
            //删除属性
            jobj.Property("Age").Remove();
            ((JArray)jobj["Wifes"])[2].Remove();
            //查找
            //遍历属性
            var props = jobj.Children().Values();
            foreach (var prop in props)
            {
                if (!(prop is JObject) && !(prop is JArray))
                {
                    Console.WriteLine(prop.ToString());
                }               
            }
            //遍历数组
            var cardList = ((JArray)jobj["Cards"]);
            foreach (var card in cardList)
            {
                Console.WriteLine(card.ToString());
            }
            //强类型读取
            Console.WriteLine(jobj.Value<int>("ID")); 
            var p2 = jobj.ToString();

三,LINQ to Json各个类型的用法汇总

//JToken: 以下两种写法都可以被转换为 JToken 类型
string jtokenstring1 = "\"Hello World\"";
string jtokenstring2 = "{\"name\":\"John\",\"age\":30}";
JToken jtoken1 = JToken.Parse(jtokenstring1);
JToken jtoken2 = (JToken)JsonConvert.DeserializeObject(jtokenstring2);


//JObject: 只能序列化标准的 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 的对象,然后转成字符串值
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 转换为字符串
// 输出结果:{\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);

四, 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);

五,序列化和反序列化

序列化(Serialize)和反序列化(Deserialize)的定义:

  • 序列化:把对象转化为可传输的字节序列过程称为序列化。
  • 反序列化:把字节序列还原为对象的过程称为反序列化。

可见,序列化的目的是为了把对象进行网络传输和跨平台存储。跨平台存储和网络传输的方式就是网络和IO,而目前网络和IO支持的数据格式就是字节数组。白话文是:把数据存储到文件中,然后其他程序读取这个文件获取数据。

序列化是把C#对象转换为Json对象,而反序列化就是把Json对象转换为C#对象。

public class Product 
{
    string Name;
    string Price decimal;
    string [] Sizes;
}

Product product = new Product();
product.Name = "Apple";
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
 
string output = JsonConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "Price": 3.99,
//  "Sizes": ["Small", "Medium", "Large"]
//}

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output)

 

摘抄文档,如有侵权,立马删除:

Newtonsoft.Json笔记 -JToken、JObject、JArray详解

Json 基于类 Newtonsoft.Json.Linq.JToken的应用简介

标签:Newtonsoft,入门,JObject,JArray,JToken,Json,new,jObj
From: https://www.cnblogs.com/ljhdo/p/17829740.html

相关文章

  • vuejs3.0 从入门到精通——Vuex 4.x —— Getter
    Vuex4.x——Getterhttps://vuex.vuejs.org/zh/guide/getters.html 有时候我们需要从store中的state中派生出一些状态,例如对列表进行过滤并计数:computed:{doneTodosCount(){returnthis.$store.state.todos.filter(todo=>todo.done).length}} 如......
  • Go语言从入门到精通
    【一】Go语言介绍及引入Go语言的介绍Go语言的诞生Go语言版本的发展Go语言的特性Go语言的应用领域【二】Go开发环境下载与安装Go编译器的下载Windows下Go的安装配置Windows配置GOPATH环境Mac下Go的安装配置Mac配置GOPATH环境变量入门案例开发工具【三】Go语言基......
  • java里junit 单元测试、注释(入门)
    什么是Junit单元测试?JUnit单元测试是指使用JUnit框架编写的针对代码中小的、独立的模块(通常是方法或者类)的测试。在JUnit中,您可以使用断言来验证代码的行为是否符合预期,以及使用注解来标记测试方法、测试套件等。执行单元测试可以帮助验证代码是否满足特定的业务需求和技术......
  • mysql常见的日期函数汇总(新手入门)
    前言mysql中有许多日期函数,能够灵活、方便处理日期数据,本节我就给大家简单的介绍一下mysql常见的几个日期函数。1、NOW()   NOW()用于返回当前时间,包括年、月、日、时、分、秒,如下实例:1.--获取当前时间NOW()格式:YYYY-MM-DD-HH-MM-SS2.SELECTNOW();  ......
  • 入门级throw与throws的区别
    throw与throws区别一:    throw与throws的区别二:    throw与throws的区别三:   throw与throws的区别四:throw,如果执行了,那么一定是抛出了某种异常了,安生throws表示可能出现,但不一定。......
  • 入门级异常捕获
    1.异常的基本概念异常就是在代码运行中所产生的错误,它会对代码的运行进行中断。Java运行的程序过程中出现异常事件,会生成一个异常类对象,它会将程序中的异常事件的信息提交给系统,而这被称为抛出(throw)异常。而当Java系统接受到该异常时,会将异常事件交给能解决该异常的代码,这被......
  • 入门级常见异常
    常见异常1.算术异常比如:除数不能为0  1.2数组越界异常 这里我的数组下标最长为4,而访问下标为5,这明显的越限了。 1.3空指针异常 结果:  1.4输入类型异常 这里我的变量为int类型,而当我输入不是int类型是,执行结果如下: ......
  • vuejs3.0 从入门到精通——Vuex 4.x —— state
    Vuex4.x——statehttps://vuex.vuejs.org/zh/guide/state.html一、单一状态树 Vuex使用单一状态树——是的,用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源(SSOT)”而存在。这也意味着,每个应用将仅仅包含一个store实例。单一状......
  • rustbook-ch1-入门指南-总结
    rustbook-ch1-入门指南-总结一、rust版本管理1、安装rust之前需要安装一个C语言编译器。正常编译、执行rust程序,需要一个链接器。由于C语言编译器通常都会附带链接器,所以需要安装一个C语言编译器。除了编译执行需要链接器外,一部分常用的Rust包会依赖使用C语言编写的代码,为了编......
  • vuejs3.0 从入门到精通——Vuex
    Vuexhttps://vuex.vuejs.org/zh/一、Vue是什么? Vuex是一个专为Vue.js应用程序开发的状态管理模式+库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。1.1、什么是"状态管理模式"? 状态管理模式是一种在前端开发中管理......