C#解析U8C返回的JSON

news2024/11/25 22:49:28

一、业务背景

最近项目需要与U8c对接,实现增删改查,借此机会,梳理一下C#解析Json字符串的问题。
这篇文章,先以查询接口为例。

二、查询接口

首先以一个查询接口为例。
在这里插入图片描述
访问U8c接口

string res = sendPost(url, strdata, trantype, system, username, password);

查看接口返回的数据
由于方法返回的是字符串
在这里插入图片描述

我们查看接口返回数据

在这里插入图片描述

我们可以看到,字符串数据。
所以第一步,需要将字符串转为JSON对象

 JObject res_obj = JObject.Parse(res);

JObject.Parse 是一个.NET库中的方法,用于将字符串转换为 JSON 对象。它可以解析符合 JSON 格式的字符串,并将其转换为 JObject 对象,以便在代码中进行处理和操作。这个方法在开发中常用于处理 JSON 数据。例如:
string jsonString = “{“name”:“John”,“age”:30,“city”:“New York”}”;
JObject jsonObject = JObject.Parse(jsonString);
通过使用 JObject.Parse,我们可以将 jsonString 字符串解析为 JSON 对象,并且可以通过键值对的方式访问和操作其中的属性。

看一下效果
在这里插入图片描述
拿出来看一下

{
	{
		"status": "success",
		"data": "{\"allcount\":2,\"retcount\":2,\"queryallsql\":\"select pk_invbasdoc from bd_invbasdoc where 1=1\",\"datas\":[{\"parentvo\":{\"pk_corp\":\"0001\",\"invcode\":\"TEST01\",\"invname\":\"灭火器\",\"pk_invcl\":\"0001F8100000000009RX\",\"invclcode\":\"39\",\"invclname\":\"安全环保\",\"pk_measdoc\":\"0001F810000000000PM5\",\"meascode\":\"1\",\"measname\":\"台\",\"pk_taxitems\":\"40040000000000000077\",\"taxitemscode\":\"2909\",\"taxitemsname\":\"其它采掘业\",\"unitvolume\":\"0.00000000\",\"unitweight\":\"0.00000000\",\"laborflag\":false,\"discountflag\":false,\"setpartsflag\":false,\"asset\":false,\"iselectrans\":false,\"isretail\":false,\"assistunit\":false,\"autobalancemeas\":false,\"ismngstockbygrswt\":false,\"isstorebyconvert\":false,\"creator\":\"17799197770\",\"creatorname\":\"陈疆\",\"createtime\":\"2023-12-14 20:06:17\",\"sealflag\":false,\"pk_invbasdoc\":\"0001F810000000000PM8\",\"ts\":\"2023-12-14 20:06:17\",\"dr\":\"0\"},\"childrenvo\":[]},{\"parentvo\":{\"pk_corp\":\"0001\",\"invcode\":\"802601001\",\"invname\":\"化工焦\",\"pk_invcl\":\"0001F8100000000009SM\",\"invclcode\":\"802601\",\"invclname\":\"焦炭-化工焦\",\"pk_measdoc\":\"0001F810000000000PM7\",\"meascode\":\"2\",\"measname\":\"吨\",\"pk_taxitems\":\"40040000000000000042\",\"taxitemscode\":\"1101\",\"taxitemsname\":\"生铁\",\"unitvolume\":\"0.00000000\",\"unitweight\":\"0.00000000\",\"laborflag\":false,\"discountflag\":false,\"setpartsflag\":false,\"asset\":false,\"iselectrans\":false,\"isretail\":false,\"assistunit\":false,\"autobalancemeas\":false,\"ismngstockbygrswt\":false,\"isstorebyconvert\":false,\"creator\":\"17799197770\",\"creatorname\":\"陈疆\",\"createtime\":\"2023-12-14 20:07:07\",\"sealflag\":false,\"pk_invbasdoc\":\"0001F810000000000PMB\",\"ts\":\"2023-12-14 20:07:07\",\"dr\":\"0\"},\"childrenvo\":[]}]}",
		"taskNumber": "202312150024"
	}
}

我们得到JObject对象之后,开始取值

foreach (JObject item in datas)
{
    // 在这里可以对 item 进行操作
}

我们取出status,判断状态是否成功,如果成功,将data值拿出

string data = res_obj.Value<string>("data");

其实从返回的数据,我们就可以看到
在这里插入图片描述
data里面的数据是字符串,我们再次转成JObject对象。

JObject data_obj = JObject.Parse(data);

然后取值。

JArray datas = data_obj.Value<JArray>("datas");

在这里插入图片描述
拿出来看一看

{
	[{
			"parentvo": {
				"pk_corp": "0001",
				"invcode": "TEST01",
				"invname": "灭火器",
				"pk_invcl": "0001F8100000000009RX",
				"invclcode": "39",
				"invclname": "安全环保",
				"pk_measdoc": "0001F810000000000PM5",
				"meascode": "1",
				"measname": "台",
				"pk_taxitems": "40040000000000000077",
				"taxitemscode": "2909",
				"taxitemsname": "其它采掘业",
				"unitvolume": "0.00000000",
				"unitweight": "0.00000000",
				"laborflag": false,
				"discountflag": false,
				"setpartsflag": false,
				"asset": false,
				"iselectrans": false,
				"isretail": false,
				"assistunit": false,
				"autobalancemeas": false,
				"ismngstockbygrswt": false,
				"isstorebyconvert": false,
				"creator": "17799197770",
				"creatorname": "xx",
				"createtime": "2023-12-14 20:06:17",
				"sealflag": false,
				"pk_invbasdoc": "0001F810000000000PM8",
				"ts": "2023-12-14 20:06:17",
				"dr": "0"
			},
			"childrenvo": []
		},
		{
			"parentvo": {
				"pk_corp": "0001",
				"invcode": "802601001",
				"invname": "化工焦",
				"pk_invcl": "0001F8100000000009SM",
				"invclcode": "802601",
				"invclname": "焦炭-化工焦",
				"pk_measdoc": "0001F810000000000PM7",
				"meascode": "2",
				"measname": "吨",
				"pk_taxitems": "40040000000000000042",
				"taxitemscode": "1101",
				"taxitemsname": "生铁",
				"unitvolume": "0.00000000",
				"unitweight": "0.00000000",
				"laborflag": false,
				"discountflag": false,
				"setpartsflag": false,
				"asset": false,
				"iselectrans": false,
				"isretail": false,
				"assistunit": false,
				"autobalancemeas": false,
				"ismngstockbygrswt": false,
				"isstorebyconvert": false,
				"creator": "17799197770",
				"creatorname": "xx",
				"createtime": "2023-12-14 20:07:07",
				"sealflag": false,
				"pk_invbasdoc": "0001F810000000000PMB",
				"ts": "2023-12-14 20:07:07",
				"dr": "0"
			},
			"childrenvo": []
		}
	]
}

下面是一个数组
使用for循环,进行取值

foreach (JObject item in datas)
{
}

取出第一个Jobject对象的parentvo的值

 JObject parentvo = item.Value<JObject>("parentvo");

拿出字段值

invclcode = parentvo.Value<string>("invcode");
invclname = parentvo.Value<string>("invclname");

看一下是否取成功
在这里插入图片描述
成功!!!

三、完整代码

查询方法:

   public ActionResult WLQuery()
   {
  
       string url = "http://xxxxx/u8cloud/api/uapbd/invbasdoc/query";
       string username = "xx";
       string password = "5xx70e2bf5xx84exx2c731a";
       string system = "xxxx";
       string trantype = "undefined";
       string strdata = string.Empty;
       string invclcode = string.Empty;//cinvclasscode 存货分类编码
       string invclname = string.Empty;//cinvclassname存货分类名称
       string invshortname = string.Empty;//cinvname 存货简称
       string invspec = "";//cinvstd 型号
       string meascode = "";//cunit 主计量单位
       string creator = string.Empty;//创建人
       string creatorname = string.Empty;//cmaker 创建人名称
       string createtime = string.Empty;
       string sql = string.Empty;
       IDatabase db = DataFactory.Database();
       DbTransaction trans = db.BeginTrans();
       var data_in = new
       {

       };
       strdata = JsonConvert.SerializeObject(data_in);
       strdata = strdata.Replace("null", "");

       string res = sendPost(url, strdata, trantype, system, username, password);
       JObject res_obj = JObject.Parse(res);
       if(res_obj.Value<string>("status").ToString() == "success")
       {
           string data = res_obj.Value<string>("data");
           JObject data_obj = JObject.Parse(data);
           JArray datas = data_obj.Value<JArray>("datas");

           foreach (JObject item in datas)
           {
               JObject parentvo = item.Value<JObject>("parentvo");
                invclcode = parentvo.Value<string>("invcode");
                invclname = parentvo.Value<string>("invclname");
                invshortname = parentvo.Value<string>("invshortname");
                invspec = parentvo.Value<string>("invspec");
               meascode = parentvo.Value<string>("measname");
               creator = parentvo.Value<string>("creator");
               creatorname = parentvo.Value<string>("creatorname");
               createtime = parentvo.Value<string>("createtime");

               sql = $"insert into ba_inventory_e  (id,ddate,cinvclasscode,cinvclassname,cinvname,cinvstd,cunit,cmaker) values(newid(),'{createtime}','{invclcode}','{invclname}','{invshortname }','{invspec}','{meascode}','{creatorname}')";
               string isOK = db.ExecuteSql(new StringBuilder(sql));
               if (!"OK".Equals(isOK.ToUpper()))
               {
                   return Content(new JsonMessage { Success = false, Code = "-1", Message = "插入物料档案失败!" + isOK }.ToJson());
                   db.Rollback();
               }
           }
       }
       db.Commit();
       return Content(new JsonMessage { Success = true, Code = "1", Message = "U8C物料档案查询并录入OA系统成功!" }.ToJson());
   }

http访问方法

  public string sendPost(string url, string json, string trantype, string system, string usercode, string password)
  {
      System.IO.Stream stream = null;
      StreamReader reader = null;
      try
      {
          Encoding encoding = Encoding.UTF8;
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
          request.Method = "POST";
          request.Accept = "text/html, application/xhtml+xml, */*";
          request.ContentType = "application/json";

          request.Headers["trantype"] = trantype;
          request.Headers["system"] = system;
          request.Headers["usercode"] = usercode;
          request.Headers["password"] = password;

          byte[] buffer = encoding.GetBytes(json);
          request.ContentLength = buffer.Length;
          request.GetRequestStream().Write(buffer, 0, buffer.Length);
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          using (reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
              return reader.ReadToEnd();
      }
      catch (Exception ex)
      {
          Console.WriteLine(ex.Message);
      }
      finally
      {
          //if (writer != null) writer.Close();
          if (stream != null) stream.Close();
          if (reader != null) reader.Close();
      }
      return null;
  }

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

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

相关文章

Docker网络模式:深度理解与容器网络配置

Docker 的网络模式是容器化应用中一个关键而复杂的方面。本文将深入讨论 Docker 的网络模式&#xff0c;包括基本概念、常用网络模式以及高级网络配置&#xff0c;并通过更为丰富和实际的示例代码&#xff0c;帮助读者全面掌握如何理解和配置容器网络。 Docker网络基础 1 Doc…

聚类笔记:聚类算法评估指标

1 内部评估方法 当一个聚类结果是基于数据聚类自身进行评估的&#xff0c;这一类叫做内部评估方法。如果某个聚类算法聚类的结果是类间相似性低&#xff0c;类内相似性高&#xff0c;那么内部评估方法会给予较高的分数评价。不过内部评价方法的缺点是&#xff1a; 这些评估方法…

阿里云部署k8s with kubesphere

阿里云ESC 创建实例 填入密码即可 云上的防火墙相关设置就是安全组 vpc 专有网络 划分私有ip 子网 vpc 隔离环境域 不同的vpc下 即使相同的子网也不互通 使用交换机继续划分子网 停止 释放 不收钱 k8s 服务器 4核8G*1 8核16G *2 git 创建凭证 pipeline 发邮箱 (p124)…

2019年第八届数学建模国际赛小美赛B题数据中心冷出风口的设计解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 B题 数据中心冷出风口的设计 原题再现&#xff1a; 这是数据中心空调设计面临的一个问题。在一些数据中心&#xff0c;计算机机柜是开放的&#xff0c;在一个房间里排列成三到四排。冷却后的空气通过主管进入房间&#xff0c;并分为三到四个…

XUbuntu22.04之HDMI显示器设置竖屏(一百九十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

五:爬虫-数据解析之xpath解析

五&#xff1a;数据解析之xpath解析 1.xpath介绍&#xff1a; ​ xpath是XML路径语言&#xff0c;它可以用来确定xml文档中的元素位置&#xff0c;通过元素路径来完成对元素的查找&#xff0c;HTML就是XML的一种实现方式&#xff0c;所以xpath是一种非常强大的定位方式​ XPa…

国际语音群呼系统有哪些应用场景?

国际语音群呼可应用于广告营销、消息通知、客情维护、金融催收等场景&#xff0c;助力出海企业产品营销和品牌推广。 广告营销 出海企业可以通过国际语音群呼系统&#xff0c;向目标市场的潜在客户进行广告宣传。例如&#xff0c;企业可以在系统中录制有关产品的宣传语&#…

大模型应用_PrivateGPT

https://github.com/imartinez/privateGPT 1 功能 整体功能&#xff0c;想解决什么问题 搭建完整的 RAG 系统&#xff0c;与 FastGPT相比&#xff0c;界面比较简单。但是底层支持比较丰富&#xff0c;可用于知识库的完全本地部署&#xff0c;包含大模型和向量库。适用于保密级…

STM32在CTF中的应用和快速解题

题目给的是bin文件&#xff0c;基本上就是需要我们手动修复的固件逆向。 如果给的是hex文件&#xff0c;我们可能需要使用MKD进行动态调试 主要还是以做题为目的 详细的可以去看文档&#xff1a;https://pdf1.alldatasheet.com/datasheet-pdf/view/201596/STMICROELECTRONIC…

ZLMediaKit 编译以及测试(Centos 7.9 环境)

文章目录 一、前言二、编译器1、获取代码2、编译器2.1 编译器版本要求2.2 安装编译器 3、安装cmake4、依赖库4.1 依赖库列表4.2 安装依赖库4.2.1 安装libssl-dev和libsdl-dev4.2.2 安装 ffmpeg-devel依赖和ffmpeg依赖 三、构建和编译项目&#xff08;启用WebRTC功能&#xff09…

三大循环语句

goto 我们看代码去感受goto的循环&#xff0c;那么goto循环最经常搭配的就是loop&#xff0c;那么就像如下代码 这个代码中loop&#xff1a;就是个标志&#xff0c;然后程序正常向下运行&#xff0c;goto loop&#xff1b;就会让她回到loop&#xff0c;然后在运行到goto loop…

解决nuxt3引入图片报错:ReferenceError: require is not defined

现象&#xff1a; 原因&#xff1a;在nuxt3中不支持require的方式引入图片/文件等静态资源。 解决办法&#xff1a; 1. 直接在img标签中的src属性里写明图片的路径&#xff0c;但是此时src前面不能有冒号做动态绑定&#xff01;&#xff1a; src"/assets/images/loading…

在IDEA中使用Git 、远程仓库克隆工程到本地

4.1 在IDEA中配置Git 安装好IntelliJ IDEA后&#xff0c;如果Git安装在默认路径下&#xff0c;那么idea会自动找到git的位置&#xff0c;如果更改了Git的安装位置则需要手动配置下Git的路径。 选择File→Settings打开设置窗口&#xff0c;找到Version Control下的git选项&…

产品经理之如何编写竞品分析(医疗HIS系统管理详细案例模板)

目录 一.项目周期 二.竞品分析的目的 三.竞品分析包含的维度 四.如何选择竞品 五.竞品画布 六.案例模板 一.项目周期 在整个项目的周期&#xff0c;产品经理所做的事情主要在项目前期做市场分析、需求调研等&#xff0c;下面一张图概况了整个项目周期产品经理、开发工程师…

c++ qt 窗口开发中 俩按钮组合 配合 显影 已解决

在日常项目中&#xff0c;有这么需求&#xff0c;还想窗口移动&#xff0c;还想 右侧关闭 还能tab栏点击显影的需求&#xff0c;不得使用 qt模拟点击事件 进行功能优化 特大杯 大杯 控制 窗口显影&#xff0c; 咖啡 按钮 显示窗口 可乐 豆浆 不显示窗口 四个按钮的 互斥关…

智能优化算法应用:基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.共生生物算法4.实验参数设定5.算法结果6.…

hive常用SQL函数及案例

1 函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Java中的函数。 好处&#xff1a;避免用户反复写逻辑&#xff0c;可以直接拿来使用。 重点&#xff1a;用户需要知道函数叫什么&#xff0c;能做什么。 Hive提供了大量的内置函数&#xff0c;按照其特…

Unity中的ShaderToy

文章目录 前言一、ShaderToy网站二、ShaderToy基本框架1、我们可以在ShaderToy网站中&#xff0c;这样看用到的GLSL文档2、void mainImage 是我们的程序入口&#xff0c;类似于片断着色器3、fragColor作为输出变量&#xff0c;为屏幕每一像素的颜色&#xff0c;alpha一般赋值为…

17.分割有效信息【2023.12.9】

1.问题描述 有时候我们需要截取字符串以获取有用的信息&#xff0c;比如对于字符串 “日期&#xff1a;2010-10-29”&#xff0c;我们需要截取后面的 10 个字符来获取日期&#xff0c;以便进行进一步分析。编写一个程序&#xff0c;输入一个字符串&#xff0c;然后输出截取后的…

快速多列查找匹配关键字

实例需求&#xff1a;根据第一列专业名称&#xff0c;在“专业分类指导目录”中&#xff0c;针对三个学历层次&#xff08;研究生、本科生、专科生&#xff09;分别查找对应专业类别&#xff0c;填写在对应位置&#xff0c;即截图中的黄色区域。 需要注意如下两点&#xff1a; …