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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊缓存如何进行测试的

为了提升数据访问速度&#xff0c;减少后端服务如数据库的负载&#xff0c;提高系统整体性能&#xff0c;在系统中通常会使用缓存中间件&#xff0c;以下是缓存中间的类型&#xff1a; 缓存中间件类型&#xff1a; 通用内存缓存&#xff1a; Memcached&#xff1a;这是一个高性…

YOLOv10改进 | 主干篇 | YOLOv10引入华为VanillaNet替换Backbone

1. VanillaNet介绍 1.1 摘要: 基础模型的核心是“越多越好”的理念,计算机视觉和自然语言处理领域取得的惊人成功就是例证。 然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性转变。 在这项研究中,我们介绍了 VanillaNet,一种设计优雅的神经网络架构。 通过避免…

图片的dpi分辨率数值能改吗?在线改图片分辨率的方法及步骤

图片分辨率修改是怎么操作的&#xff1f;在使用图片的时候&#xff0c;在很多的情况下需要修改图片分辨率api的数值后才可以正常使用&#xff0c;那么修改图片dpi具体该怎么操作呢&#xff0c;相信有很多小伙伴对于这个问题的处理方法都比较困扰&#xff0c;下面就让小编来给大…

插接件焊盘设计

插件孔的标准孔径尺寸&#xff1a;0.60mm(23.6mil)&#xff0c;0.70mm(27.6mil)&#xff0c;0.80mm(31.5mil)&#xff0c;0.90mm(35.4mil)&#xff0c;1.0mm(39.4mil) 插件元器件引线(圆柱形)直径与插件孔直径D之差应为0.40mm(16mil)&#xff5e;0.60mm(24mil)&#xff0c;即插…

SambaLingo——教会大模型新语言

在当今数字化时代&#xff0c;语言不仅是沟通的桥梁&#xff0c;也是信息和知识传递的核心。尽管大模型&#xff08;LLMs&#xff09;在处理英语等主流语言方面取得了显著进展&#xff0c;但它们在理解和生成其他语言内容方面的能力却参差不齐。这种不平衡限制了技术在全球范围…

【云原生|K8S系列】如何创建Kubernetes job和Cronjobs 入门指南

本kubernetes教程解释了如何创建kubernetes作业和cronjobs&#xff0c;以及它的基础知识、用例和一些提示和技巧。 什么是Kubernetes Job? Kubernetes job和cronjob是Kubernetes对象&#xff0c;主要用于短期和批处理工作负载。 kubernetes作业对象基本上部署了一个pod&…

Instagram Reels API接口——高效获取用户主页Reels视频

一、引言 Instagram作为全球知名的社交媒体平台&#xff0c;近年来推出的Reels功能受到了广大用户的热烈欢迎。Reels以短视频的形式&#xff0c;让用户能够轻松创作和分享有趣、有创意的内容。为了帮助开发者、品牌和分析师更好地利用这一功能&#xff0c;我们推出了一款专注于…

四十九、openlayers官网示例Immediate Rendering (Geographic)——在地图上绘制星空动画效果

官网demo地址&#xff1a; Immediate Rendering (Geographic) 首先先创建1000个随机点&#xff0c;创建点对象。 const n 1000;const geometries new Array(n);for (let i 0; i < n; i) {const lon 360 * Math.random() - 180;const lat 180 * Math.random() - 90;ge…

运算放大器(运放)同相放大器电路

设计目标 输入电压ViMin输入电压ViMax输出VoMin输出VoMax电源Vcc电源Vee-1V1V-10V10V15V–15V 设计说明 这种设计将输入信号 Vi 放大&#xff0c;信号增益为 10V/V。输入信号可能来自高阻抗源&#xff08;例如 MΩ&#xff09;&#xff0c;因为该电路的输入阻抗由运算放大器…

【C++ | 移动构造函数】C++11的 移动构造函数 详解及例子代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-12 2…

和鲸101计划:Python 气象海洋数据分析 Workshop 回顾

导语&#xff1a;一个科学家最大的价值不是个人取得了多少成绩&#xff0c;而是他培养了多少科学家&#xff0c;他的学生又培养出多少科学家。如果科学精神能从我们这里一代代传承&#xff0c;并且不断推动社会进步&#xff0c;这就是我们此生最大的价值。 ——源自《中国气象…

Day28:回溯法 491.递增子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解数独 蓝桥杯 与或异或

491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情…

双指针问题2

文章目录 1. 有效三角形的个数&#xff08;611&#xff09;2. 查找总价格为目标值的两个商品&#xff08;LCR179&#xff09;3. 三数之和&#xff08;15&#xff09;4. 四数之和&#xff08;18&#xff09; 1. 有效三角形的个数&#xff08;611&#xff09; 题目描述&#xff…

逻辑蕴含、函数依赖集的闭包、Armstrong公理、属性集闭包

一、引言 Armstrong公理-从给定的函数依赖集得到关系模式的完整依赖集 二、逻辑蕴含 1、定义 设F是关系模式R上的函数依赖集&#xff0c;X、Y是R的属性子集&#xff0c;对于R的每个满足F的关系实例r&#xff0c;若函数 依赖都成立&#xff0c;则称F逻辑蕴含。 记为&#…

Mamaba3--RNN、状态方程、勒让德多项式

Mamaba3–RNN、状态方程、勒让德多项式 一、简单回顾 在Mamba1和Mamba2中分别介绍了RNN和状态方程。 下面从两个图和两个公式出发&#xff0c;对RNN和状态方程做简单的回顾&#xff1a; R N N : s t W s t − 1 U x t &#xff1b; O t V s t RNN: s_t Ws_{t-1}Ux_t&…

shadertoy-安装和使用

一、安装vscode 安装vscode流程 二、安装插件 1.安装glsl编辑插件 2.安装shader toy插件 三、创建glsl文件 test.glsl文件 float Grid(float size, vec2 fragCoord) {vec2 r fragCoord / size;vec2 grid abs(fract(r - 0.5) - 0.5) / fwidth(r);float line min(grid…

Linux内核开发-编译内核源码

前言 大部分公司的所谓的Linux内核工程师主要工作是基于社区开源内核进行定制化修改&#xff0c;基本不会有机会向上游提供patch&#xff0c;仅限于公司内部业务的修修补补。 作为内核开发工程师两年多&#xff0c;精力一直被公司业务消耗&#xff0c;所有的内核知识都来自于…

异构集成封装类型2D、2.1D、2.3D、2.5D和3D封装技术

异构集成封装类型&#xff1a;2D、2.1D、2.3D、2.5D和3D封装详解 简介随着摩尔定律的放缓&#xff0c;半导体行业越来越多地采用芯片设计和异构集成封装来继续推动性能的提高。这种方法是将大型硅芯片分割成多个较小的芯片&#xff0c;分别进行设计、制造和优化&#xff0c;然后…

【深度学习驱动流体力学】计算流体力学openfoam-paraview与python3交互

目的1:配置 ParaView 中的 Python Shell 和 Python 交互环境 ParaView 提供了强大的 Python 接口,允许用户通过 Python 脚本来控制和操作其可视化功能。在 ParaView 中,可以通过 View > Python Shell 菜单打开 Python Shell 窗口,用于执行 Python 代码。要确保正确配置 …

[Linux] vi编辑器

命令模式&文本模式 命令模式就输入命令然后执行&#xff0c;文本模式就是系统把你的输入都当成写进文件里的字符 切换模式&#xff1a; 刚进入默认是命令模式&#xff0c;按: i I a A o O 进入文本模式&#xff0c; 通过他们进入文本模式有什么不同&#xff1f; 然后按esc进…