newtonsoft.json动态读取json以及动态生成

2024-06-20 03:28

本文主要是介绍newtonsoft.json动态读取json以及动态生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

同一个接口返回不同类型的json,json结构相差比较大转换为C#对象不太合适,想着是否可以动态解析。

newtonsoft类

在这里插入图片描述
JTokenType类型

namespace Newtonsoft.Json.Linq
{/// <summary>/// Specifies the type of token./// </summary>public enum JTokenType{/// <summary>/// 未知类型/// </summary>None = 0,/// <summary>/// JSON对象/// </summary>Object = 1,/// <summary>/// JSON数组/// </summary>Array = 2,/// <summary>/// JSON 构造函数/// </summary>Constructor = 3,/// <summary>/// JSON对象的属性/// </summary>Property = 4,/// <summary>/// 备注/// </summary>Comment = 5,/// <summary>/// 整数值/// </summary>Integer = 6,/// <summary>/// 浮点数/// </summary>Float = 7,/// <summary>/// 字符串/// </summary>String = 8,/// <summary>/// 布尔值/// </summary>Boolean = 9,/// <summary>/// null值/// </summary>Null = 10,/// <summary>/// undefined值/// </summary>Undefined = 11,/// <summary>/// 时间类型/// </summary>Date = 12,/// <summary>/// 原始的json值/// </summary>Raw = 13,/// <summary>/// 字节值的集合/// </summary>Bytes = 14,/// <summary>/// GUID值/// </summary>Guid = 15,/// <summary>/// Uri值/// </summary>Uri = 16,/// <summary>/// 时间戳值/// </summary>TimeSpan = 17}
}

读取

JToken

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

在这里插入图片描述

JObject

// 只能序列化标准的 json 字符串
string jobjstring2 = "{\"name\":\"John\",\"age\":30}";
JObject jobj1 = JObject.Parse(jobjstring2);
JObject jobj2 = (JObject)JsonConvert.DeserializeObject(jobjstring2);
Console.WriteLine(jobj1.Type);
Console.WriteLine(jobj1.HasValues);
Console.WriteLine(jobj2.Type);
Console.WriteLine(jobj2.HasValues);

在这里插入图片描述

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);
Console.WriteLine(jarray1.Type);
Console.WriteLine(jarray1.HasValues);
Console.WriteLine(jarray2.Type);
Console.WriteLine(jarray2.HasValues);

在这里插入图片描述

JProperty

//在JObject中是一个name/JToken键值对
string jobjstring2 = "{\"name\":\"John\",\"age\":30}";
JObject jobj1 = JObject.Parse(jobjstring2);
if (jobj1.HasValues)
{foreach (var property in jobj1.Values<JProperty>()){Console.WriteLine(property.Name);Console.WriteLine(property.Type);Console.WriteLine(property.Value);}
}

在这里插入图片描述

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字符串如何解析全部的数据

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;namespace JsonStu01;class Program
{static void Main(string[] args){ExampleData data = new ExampleData  {  StringValue = "Hello, World!",  IntValue = 123,  DoubleValue = 456.789,  BooleanValue = true,  DateTimeValue = DateTime.Now,  ArrayValue = new object[] { "item1", 2, 3.14, false, null },  NestedObject = new ExampleNestedData { NestedStringValue = "Nested Value" },  NullableIntValue = 100 // 或者你可以设置为 null 来表示它是可空的  };  string jsonString = JsonConvert.SerializeObject(data, Formatting.Indented);Console.WriteLine(jsonString);var jToken = JToken.Parse(jsonString);Console.WriteLine("========================================");JTokenParsePrint(jToken);Console.WriteLine("========================================");JTokenParsePrint2(jToken);}static void JTokenParsePrint(JToken jToken){if (jToken.HasValues){foreach (var value in jToken.Values()){if (value.HasValues){JTokenParsePrint(value);}else{var res = value as JValue;if (res != null){Console.WriteLine(res);}else{Console.WriteLine("强制转化失败");Console.WriteLine(value.Type);}}}}else{var value = jToken as JValue;Console.WriteLine(value);}}static void JTokenParsePrint2(JToken jToken){if (jToken is JObject jObject)  {  foreach (JProperty property in jObject.Properties())  {  if (property.Value.Type == JTokenType.Object || property.Value.Type == JTokenType.Array)  {  //Console.WriteLine("--- Nested Value ---");  Console.WriteLine($"Property Name: {property.Name}");JTokenParsePrint2(property.Value); // 递归调用  //Console.WriteLine("--- End Nested Value ---");  }else{Console.WriteLine($"Property Name: {property.Name}, Value: {property.Value}");  }}  }  else if (jToken is JArray jArray)  {  foreach (JToken item in jArray)  { if (item.Type == JTokenType.Object || item.Type == JTokenType.Array)  {  //Console.WriteLine("--- Nested Value ---");  JTokenParsePrint2(item); // 递归调用  //Console.WriteLine("--- End Nested Value ---");  }else{Console.WriteLine("Array Item: " + item);  }}  }  else  {  Console.WriteLine("Token Value: " + jToken);  }  }
}public class ExampleNestedData  
{  public string NestedStringValue { get; set; }  
}  public class ExampleData  
{  public string StringValue { get; set; }  public int IntValue { get; set; }  public double DoubleValue { get; set; }  public bool BooleanValue { get; set; }  public DateTime DateTimeValue { get; set; }  public object[] ArrayValue { get; set; }  public ExampleNestedData NestedObject { get; set; }  public Nullable<int> NullableIntValue { get; set; }  
}  

生成json

JToken

JTokenWriter writer = new JTokenWriter();
writer.WriteStartObject();
writer.WritePropertyName("Title");
writer.WriteValue("aaaaaaa???");writer.WritePropertyName("Detail");   writer.WriteStartArray();
writer.WriteValue("Yes");
writer.WriteValue("No");
writer.WriteValue("Unknown");
writer.WriteEndArray();writer.WriteEndObject();JObject o = (JObject)writer.Token;
Console.WriteLine(o.ToString());

在这里插入图片描述

JObject

JObject o = new JObject 
{{"CPU","Intel"},{"Memory",2048},{"Drives",new JArray{"DVD","U盘"}}
};Console.WriteLine(o.ToString());

在这里插入图片描述

JArray

var array = new JArray();
array.Add(new JObject()
{{ "pkgType","type"},{ "pkgPart","pkgPart"},{ "pkgLotId","pkgLotId"},{ "dateCode","dateCode"},{ "dateTime",System.DateTime.Now.ToString()}
});
//不能添加JProperty
Console.WriteLine(array.ToString());

在这里插入图片描述

JProperty

// 创建一个 JProperty 的对象,然后转成字符串值
string propertyname = "name";
string propertyvalue = "John";
JProperty jproperty = new JProperty(propertyname, propertyvalue);
var jp = jproperty.ToString(); // 结果:"name": "John"
Console.WriteLine(jp);
// 下面将 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}
// 但是通过这个输出的格式进行序列化时,就会提示异常,如下:
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);

在这里插入图片描述

JValue

Console.WriteLine(new JValue("aaa").ToString());
Console.WriteLine(new JValue(true).ToString());
Console.WriteLine(new JValue(new Uri("https://hao.360.com/")).ToString());
JObject obj = new JObject();
obj.Add("aaa",new JValue("aaa"));
var arr = new JArray();
arr.Add(new JValue(100));
arr.Add(new JValue(10.0));
arr.Add(new JValue(true));
obj.Add("array",arr);
Console.WriteLine(obj.ToString());

在这里插入图片描述

JSON合并

//JSON合并
var o1Str = @"{'FirstName': 'John','LastName': 'Smith','Enabled': false,'Roles': [ 'User' ]}";
var o2Str = @"{'Enabled': true,'Roles': [  'Admin' ]}";
JObject o1 = JObject.Parse(o1Str);
JObject o2 = JObject.Parse(o2Str);o1.Merge(o2, new JsonMergeSettings
{// union arrays together to avoid duplicatesMergeArrayHandling = MergeArrayHandling.Union
});Console.WriteLine(o1.ToString());

在这里插入图片描述

参考

https://www.cnblogs.com/fanfan-90/p/12659937.html
https://www.cnblogs.com/hnzhengfy/p/JObjectJArray.html

这篇关于newtonsoft.json动态读取json以及动态生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076966

相关文章

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文