JSON /XML转换

命名控件需要

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

using System.Xml;

using System.Linq;

XML转Json/JObject 用到的全部核心API

核心转换静态方法JsonConvert.SerializexNode();

string jsonText=JsonConvert.SerializeXmlNode(xmlDoc);

//再把JSON字符串转换为JObject

JObject jobject=JObject.Parse(jsonText);

复制代码
  XmlDocument xmlDoc = new XmlDocument();

  private void btn_xml_Click(object sender, EventArgs e)
  {
      xmlDoc.Load(@"./Config/Menu.xml");

      string jsonText=JsonConvert.SerializeXmlNode(xmlDoc);  //JsonConvert.SerializeXmlNode(xmlDoc)将繁琐的XML文档直接编程JSON格式的字符串

      JObject jobj=JObject.Parse(jsonText);  //JObject.Parse(jsonText)将JSON格式的字符串直接编程JObject对象
 
  }

拿到 JObject / JToken / JArray 后,高频成员方法大全

层级关系:

  • JToken:抽象基类,JObject、JArray、JValue、JProperty 都继承它
  • JObject:json 对象 { "a":1 },键值对集合
  • JArray:json 数组 [ {...}, {...} ]
  • JValue:普通值(字符串、数字、bool)

🟢 JObject 常用

表格

用法 说明
jobj["keyName"] 索引器,返回JToken找不到返回 null,不抛异常
jobj.TryGetValue("key", out JToken token) 安全获取,不会抛异常,推荐优先用
jobj.Property("keyName") 获取属性对象JProperty,可以取 Name/Value
jobj.Children() 获取所有直接子节点,返回IEnumerable<JToken>
jobj.Properties() 获取全部属性集合IEnumerable<JProperty>
jobj.ToObject<T>() 反序列化为 C# 实体类,如jobj.ToObject<MenuConfig>()
jobj.Remove("key") 删除某个 key
jobj.Add("key",value) 新增属性

🟢 JToken(最常用,因为索引返回都是 JToken)

复制代码
// 类型判断
token.Type == JTokenType.Array      //是不是数组
token.Type == JTokenType.Object     //是不是对象
token.Type == JTokenType.String
token is JArray arr; //模式匹配C#7+
token is JObject obj;

// 转换
string str = (string)token;
int num = (int)token;

// 递归子节点
token.Children();
token.Descendants(); //递归所有后代(深层全部子节点)

// 选择
token.SelectTokens("$..menuItem"); //jsonpath,递归找所有名为menuItem节点
cs 复制代码
./Config/ProtDevicePara.xml

<dev>
  <BaseData>
	  <DeviceConfigData>
		  <DeviceName>RS485COM</DeviceName>
		  <portName>COM3</portName>
		  <baudRate>115200</baudRate>
		  <dataBits>8</dataBits>
		  <parity>0</parity>
		  <stopBits>1</stopBits>
		  <sendMode>byte</sendMode>
	  </DeviceConfigData>
	  <DeviceConfigData>
		  <DeviceName>RS422COM测距1</DeviceName>
		  <portName>COM7</portName>
		  <baudRate>115200</baudRate>
		  <dataBits>8</dataBits>
		  <parity>0</parity>
		  <stopBits>1</stopBits>
		  <sendMode>string</sendMode>
	  </DeviceConfigData>
	  <DeviceConfigData>
		  <DeviceName>RS422COM测距2</DeviceName>
		  <portName>COM8</portName>
		  <baudRate>115200</baudRate>
		  <dataBits>8</dataBits>
		  <parity>0</parity>
		  <stopBits>1</stopBits>
		  <sendMode>string</sendMode>
	  </DeviceConfigData>
  </BaseData>
<swRefreshDB>False</swRefreshDB>
</dev>




string fileName="./Config/ProtDevicePara.xml";
XmlDocumnet xmlDoc=new XmlDocument();
xmlDoc.Load(fileName);
string jsonText=JsonConvert.SerializeXmlNode(xmlDoc);
JObject jobj=JObject.Parse(jsonText);

JToken jToken=jobj["dev"]["BaseData"];
if(jToken.Type==JTokenType.Array){
        JArray arr=(JArray)JToken;
        MessageBox.Show("JToken jToken=jobj["dev"]["BaseData"]是数组");
    foreach( var item in arr)
        {
  txt_ShowMessage.Text += item.ToString()+"\r\n";
   }
}
 else if (jToken.Type==JTokenType.Object)
 {
     JObject obj=(JObject)jToken;
     txt_ShowMessage.Text += "jToken是单个Object类型\r\n";
 }


//拿到dev BaseData  第二个DeviceConfigData中的sendMode
JToken itemToken=jobject["dev"]?["BaseData"]?["DeviceConfigData"]?[1];
if(itemToken.Type==JTokenType.Object){
 string sendMode=(string itemToken["sendMode"];
 textBox1.Text+=sendMode;
}


//拿到所有DeviceConfigData中的DeviceName:
JToken jToken2=jobject["dev"]["BaseData"]["DeviceConfigData"].Value<JArray>();
 if (jToken2.Type==JTokenType.Array)
 { 
     foreach (JToken item in jToken2)
     {
         textBox1.Text += item.ToString() + "\r\n";   //显示了所有的数据
     }
 }

string[] DeviceNames=jToken2.Select(data=>(string)data["DeviceName"]).ToArray();
string[] COMNames = jToken.Select(data => (string)data["portName"]).ToArray();
相关推荐
Asurplus4 小时前
【SpringBoot4】3、从SpringBoot4升级Sa-Token1.46.0报错
redis·sa-token·json·jackson·springboot4
代码中介商7 小时前
C++ 预约系统实战(三):服务端实现——libevent 事件驱动与业务路由
c++·json·c/s
譕痕1 天前
notepad++安装插件 可视化展示 json串内容
json·intellij-idea
databook1 天前
DuckDB + SQL 高效分析 JSON 数据
数据分析·json·nosql
执明wa1 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio
wl85112 天前
SAP CPI 教程004 如何通过groovy修改XML节点属性值
xml
数据狐(Datafox)2 天前
1688商品列表API接口解析(附 JSON 样例)
java·开发语言·数据库·爬虫·json
码匠许师傅3 天前
【C++三方组件】TinyXML2:两个文件的极简 XML 解析器
xml·c++
j7~3 天前
【Linux网络加餐】(篇六)网络版计算器(上):模板方法模式、序列化与 JSON
linux·c++·json·序列化·反序列化·网络版计算机
梦帮科技4 天前
Next.js 16 模块化单体实战:App Router、领域模块与 Route Handler 分层
css·数据结构·链表·正则表达式·node.js·json·html5