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 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年618成交额达7428亿 淘宝京东618交易额数据对比排名

2024年618年中大促已经基本落下帷幕&#xff0c;作为上半年最重要的电商节日&#xff0c;今年的618交易额有多少&#xff1f;今年的交易数据有哪些变化&#xff1f;我们来一起看一下&#xff01; 根据星图监测数据显示&#xff0c;2024年618期间&#xff08;天猫5月20日20: 00-…

2024年一年一度的618正式结束了,苹果与华为手机销量看看谁是大赢家?

一年一度的618正式结束了&#xff0c;各品牌基本上都发布了相应的战报。但是要告诉大家一点看战报要看定语&#xff0c;定语最少的才是真正的第一。现在给大家汇总下京东平台的数据&#xff0c;看看谁是最大赢家&#xff0c;谁又是国产荣光。注&#xff1a;所有数据截至6月18日…

关于app爬虫的环境准备

摘要 有些数据需要在手机应用中才能查看&#xff0c;没有网页版&#xff0c;所以学习移动端的爬虫是有必要的。 手机系统分为安卓和苹果两大系统&#xff0c;本次讲解主要以安卓手机为例 有安卓手机的可以使用手机&#xff0c;没有的可以使用模拟器&#xff0c;本次以夜神模…

打破数据分析壁垒:SPSS复习必备(二)

一、变量级别的数据管理 操作内容主要集中于“转换”菜单中&#xff0c;包括新变量的生成、记录的排序、对变量进行计数等。 (1)计算新变量&#xff1a;是菜单最上方的“计算变量”过程&#xff0c;这是该菜单中最为常用和重要的过程。 (2)变量转换&#xff1a;包括从菜单第2项…

【玩儿】TX应用宝模拟器安装第三方APK

TX应用宝模拟器安装第三方APK 前言应用宝下载安装三方APK安装审核应用安装自研应用安装执行 adb 命令创建应用快捷方式 前言 腾讯应用开放平台公布了应用宝电脑版的产品详情&#xff0c;应用宝电脑版支持从PC桌面直接打开安卓应用&#xff0c;无需感知应用市场打开界面&#x…

视频智能分析平台智能边缘分析一体机视频监控业务平台区域人数不足检测算法

智能边缘分析一体机区域人数不足检测算法是一种集成了先进图像处理、目标检测、跟踪和计数等功能的算法&#xff0c;专门用于实时监测和统计指定区域内的人数&#xff0c;并在人数不足时发出警报。以下是对该算法的详细介绍&#xff1a; 一、算法概述 智能边缘分析一体机区域…

centos7安装FTP服务器

目录 实验背景 一、配置yum源 1、本地yum 2、阿里云yum 二、安装vsftpd 1、安装vsftp服务 2、启动服务并设置开机自启动 3、开放防火墙和SELinux 三、创建用户和FTP目录 1、创建文件目录并配置权限 2、创建ftp组以及用户 四、修改vsftpd.conf文件 1、备份 vsftpd.c…

天然之选:炯炯侠石斛棒助力儿童视力健康

如今&#xff0c;育儿已成为许多年轻父母心头的一大忧虑。随着小生命的到来&#xff0c;他们不得不调整自己的生活节奏。然而&#xff0c;孩子的成长之路并非一帆风顺。特别是随着科技的进步&#xff0c;电子产品已深入生活的方方面面&#xff0c;如何平衡孩子的学习与娱乐&…

强大的多数据库客户端工具:DataGrip【送源码】

今天给大家带来的工具是&#xff1a;DataGrip 介绍 DataGrip是jetbrains开发的一款关系数据库和 NoSQL 数据库的多数据库客户端工具&#xff0c;可以30天免费试用&#xff0c;后续使用需要购买。 DataGrip还是一款强大的跨平台工具&#xff0c;支持多种操作系统&#xff0c;比…

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&…

hadoop Yarn资源调度器

概述 Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等运算程序相当于操作系统之上的应用程序 Yarn基本架构 YARN 主要由ResourceManager、NodeManager、ApplicationMaster、Container …

2005-2022年款福特福克斯维修手册和电路图线路图接线图资料更新

经过整理&#xff0c;2005-2022年款福特福克斯全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对…

基于JSP的高校毕业生就业满意度调查统计系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;MyEclipse、Tomcat、MySQL 系统展示 首页 用…

超实用的新闻稿件撰写模板分享,拿来直接套用

新闻稿件撰写是一门艺术&#xff0c;需要具备敏锐的新闻嗅觉、扎实的写作功底和严谨的逻辑思维。从标题、导语、新闻事实到背景补充&#xff0c;再到后续事实&#xff0c;每一个环节都至关重要。今天伯乐网络传媒就来给大家分享超实用的新闻稿件撰写模板&#xff0c;拿来直接套…

【Java】已解决Java中的java.util.NoSuchElementException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决Java中的java.util.NoSuchElementException异常 一、分析问题背景 java.util.NoSuchElementException是Java中常见的运行时异常&#xff0c;它通常发生在使用迭代器&#xf…

重生之 SpringBoot3 入门保姆级学习(24、场景整合 kafka 消息发送服务)

重生之 SpringBoot3 入门保姆级学习&#xff08;24、场景整合 kafka 消息发送服务&#xff09; 6.4 消息发送服务 6.4 消息发送服务 访问 kafka-ui &#xff08;注意这里需要换成你自己的服务器或者虚拟机的 IP 地址&#xff0c;虚拟机可以用局域网 192.168.xxx.xxx 的地址&…

零基础入门学用Arduino 第五部分

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

有效粉丝不够怎么办,巨量千川助你快速涨粉,解锁更多权限

在当今的社交媒体时代&#xff0c;拥有大量的粉丝对于个人或品牌的发展至关重要。除此之外开通权限也受粉丝数量的限制&#xff08;开通橱窗带货被要求500有效粉丝&#xff0c;开蓝V也需要500粉丝&#xff0c;直播权限需要1000粉丝&#xff09;。那么怎样才能快速涨粉又对账号没…

PS系统教程23

减淡加深海绵工具 减淡工具 作用&#xff1a;提炼物体颜色 加深工具 作用&#xff1a;变暗物体颜色&#xff0c;加深物体深度 海绵工具 作用&#xff1a;修正物体饱和度&#xff0c;加大纯度 减淡工具 老套路&#xff0c;找一个图片 复制新建粘贴Ctrl键J复制图层选择减…

C语言学习之路(黑马)

文章目录 环境搭建HelloWorld代码编写代码分析执行流程 核心语法注释单行注释多行注释注释示例 关键字常量变量计算机进制数据类型标识符键盘录入 运算符算术运算符比较运算符赋值运算符自增减运算符逻辑运算符三元运算符逗号运算符运算符的优先级 流程控制语句顺序结构分支结构…