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

news2024/9/18 13:13:49

问题

同一个接口返回不同类型的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 duplicates
    MergeArrayHandling = 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.coloradmin.cn/o/1840627.html

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

相关文章

快速学习 JavaFX 进行 GUI 应用开发

JavaFX是Java的一个用于构建丰富图形用户界面的框架。通过JavaFX&#xff0c;开发者可以创建功能强大、交互性强且美观的桌面应用程序。 一、JavaFX简介 1. JavaFX的历史和现状 JavaFX最初作为Java的一部分发布&#xff0c;旨在替代Swing作为Java的主要GUI工具包。JavaFX提供…

uni-app中使用富文本rich-text个人经验

rich-text是在uni-app一个内置组件&#xff0c;用于高性能地渲染富文本内容。先贴一下官方的属性列表&#xff1a; 先说一下“selectable” 长按选择区域复制&#xff0c;这个我在APP项目中 不起作用&#xff0c;可能像文档说的&#xff0c;只支持“百度小程序”吧。在APP端起作…

为数据安全护航,袋鼠云在数据分类分级上的探索实践

在大数据时代&#xff0c;数据具有多源异构的特性&#xff0c;且价值各异&#xff0c;企业需依据数据的重要性、价值指数等予以区分&#xff0c;以利采取不同的数据保护举措&#xff0c;避免数据泄露。故而&#xff0c;数据分类分级管理属于数据安全保护中极为重要的环节之一。…

正则表达式写起来不简单,但用起来真香

说在前面 &#x1f388;整理一些常见常用的正则表达式。 常见的正则表达式 1、手机号码 /^[1][3456789][0-9]{9}$/这个正则表达式 /^[1][3456789][0-9]{9}$/ 用于匹配中国的手机号码的一部分&#xff0c;但不包括全部有效的手机号码格式。下面是对它的详细解释&#xff1a; ^…

项目三OpenStack基础环境配置与API使用

任务一 了解OpenStack基础环境配置 1.1 •数据库服务器 1.2 •消息队列服务 •AMQP系统的组成 任务二 了解并使用OpenStack API 2.1 •什么是RESTful API • RESTful API 是目前比较成熟的 一套Internet应用程序的API软件架构 。 • 表现 层&#xff08; Representation …

JavaWeb项目配置教程

将你的项目&#xff08;只有代码的文件&#xff0c;不是整个文件&#xff09;拖入idea 找到数据库配置代码&#xff08;一般在Util包里面&#xff0c;或者是properties配置文件&#xff09;并将密码修改为你的数据库密码。 点击Edit Configurations 点击Configure&#xff0…

突破数据存储瓶颈!转转业财系统亿级数据存储优化实践--图文解析

突破数据存储瓶颈&#xff01;转转业财系统亿级数据存储优化实践–图文解析 原文链接&#xff1a;https://juejin.cn/post/7358704806779437097 原文作者&#xff1a;转转技术团队 业财系统&#xff1a;业务和财务一体化系统 与传统财务记账不同&#xff0c;一笔金额不再是…

LED电子看板在提升企业数字化管理的应用价值

本文详细探讨 LED 电子看板在企业数字化管理中的应用价值&#xff0c;包括实时数据展示、可视化管理、提高生产效率、优化决策等方面&#xff0c;通过实际案例分析&#xff0c;阐述了其对企业发展的重要性。在当今数字化时代&#xff0c;企业管理面临着越来越多的挑战和机遇。为…

企业IT资源使用共享云桌面集中管理的优势

随着信息技术的飞速发展&#xff0c;企业面临着日益增长的IT资源需求和管理挑战。为了解决这一问题&#xff0c;越来越多的企业开始采用云桌面集中管理方案&#xff0c;以实现IT资源的共享和优化。 为保持企业各部门信息化和数字化业务顺利运转&#xff0c;IT需要耗费大量支持…

【BFS算法】广度搜索·由起点开始逐层向周围扩散求得最短路径(算法框架+题目)

0、前言 深度优先搜索是DFS&#xff08;Depth Frst Search)&#xff0c;其实就是前面所讲过的回溯算法&#xff0c;它的特点和它的名字一样&#xff0c;首先在一条路径上不断往下&#xff08;深度&#xff09;遍历&#xff0c;获得答案之后再返回&#xff0c;再继续往下遍历。…

使用SQLite

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 与许多其他数据库管理系统不同&#xff0c;SQLite不是一个客户端/服务器结构的数据库引擎&#xff0c;而是一种嵌入式数据库&#xff0c;它的数据库就…

微量氧传感器在3D打印中的应用

3D打印为什么需要监测氧气&#xff1f; 金属 3D 打印过程涉及使用激光技术将细金属粉末一层一层地熔合在一起。在制造零件的同时将杂质风险降至比较低是金属增材制造行业面临的主要挑战。金属 3D 打印机通常将其原料送入惰性环境中&#xff0c;以消除污染并防止质量问题。氩气…

【自撰写】【国际象棋入门】第6课 常见术语分析(一)吃双和抽将

第6课 常见术语分析&#xff08;一&#xff09;吃双和抽将 本次课中&#xff0c;我们介绍几种最为常见和常用的&#xff08;单步棋形成&#xff09;的局面、术语并对其进行简单的分析。一般说来&#xff0c;这些局面都会给予一方以“立竿见影”的优势&#xff0c;或者引向之后…

瑞尼克定制聚四氟乙烯布氏漏斗配抽滤瓶四氟抽滤装置药厂

一、产品介绍 布氏漏斗是实验室中使用的一种仪器&#xff0c;用来使用真空或负压力抽吸进行过滤。布氏漏斗可代替陶瓷布氏漏斗&#xff0c;避免碎裂&#xff0c;聚四氟乙烯材质的布氏漏斗性强&#xff0c;使用真空或负压力抽吸进行过滤也可与吸滤瓶配套&#xff0c;用于无机制…

window 卸载应用商店程序

# 使用Get-AppxPackage获取所有应用程序 # 使用Remove-AppxPackage PythonSoftwareFoundation.Python.3.12_3.12.1264.0_x64__qbz5n2kfra8p0

2024请收好这一份全面--详细的AI产品经理从业指南

前言 入行人工智能领域这段时间以来&#xff0c;从零到一把AI推荐系统产品化搭建了起来&#xff0c;也与很多同行AI产品经理小伙伴建立了联系。AI产品经理工作内容各异&#xff0c;不同AI产品化生命周期中更是大为不同&#xff0c;但对想入行AI产品经理的小伙伴来讲&#xff0…

聊一聊生成式AI

生成式AI&#xff08;Generative AI&#xff09;是指一类能够自主创造新内容的人工智能技术&#xff0c;这些内容可以是文本、图像、音频、视频等。与传统的分析性或分类性AI系统不同&#xff0c;生成式模型的主要任务不是对现有数据进行分类或预测&#xff0c;而是生成全新的、…

【C语言 || 排序】希尔排序

文章目录 前言1.希尔排序1.1 直接插入排序1.2 直接插入排序的实现1.2.1 直接插入排序的代码实现 1.3 直接插入排序的时间复杂度1.4 希尔排序1.4.1 希尔排序概念1.4.1 希尔排序的代码实现 前言 1.希尔排序 1.1 直接插入排序 在写希尔排序之前&#xff0c;我们需要先了解直接插入…

电压模式R-2R DAC的工作原理和特性

本文将探讨电压模式R-2R DAC结构。 在本文中&#xff0c;我们将探索什么是R-2R DAC以及如何实现它们。 首先&#xff0c;我们将简要回顾一下开尔文分压器DAC。这种结构很简单&#xff0c;但它们需要大量的电阻和开关来实现高分辨率DAC。这个问题的一个解决方案是称为R-2R DAC…

【python】用代码实现2024中科大强基计划数学科目第一题

题目&#xff1a; 已知正整数a,b,c满足10a11b12c123,&#xff0c;则&#xff08;a,b,c&#xff09;的组数是 思路&#xff1a; 为了找出满足等式 10a 11b 12c 123 的正整数三元组 (a, b, c) 的数量&#xff0c;我们可以使用Python编写一个简单的循环来遍历可能的 a、b 和…