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();
相关推荐
晴天1641 分钟前
VS Code `launch.json` 指南(Node.js版)-Day30
node.js·json
我命由我1234512 小时前
UI 设计 7 种排列方式
xml·学习·ui·html·产品运营·产品经理·学习方法
XLYcmy17 小时前
PDF论文处理器 - 完整使用指南
pdf·llm·json·agent·token·csv·dify
樱花落木兰21 小时前
Git 超全零基础教程|三区原理、全套命令、分支协作、冲突解决、IDEA 集成(面试必备)
ide·git·json·github
qyyyyy57021 小时前
PDF 转 JSON 怎么做?从表格和元数据提取到 LLM 结构化处理
数据库·pdf·json·erlang·llama
钱栈up1 天前
别忽略INFO日志:我用AI编码助手1小时修完3个接口的隐藏Bug
后端·json·trae
迷迭香yy1 天前
A股数据本地存储方案对比JSON、SQLite、ClickHouse、DuckDB怎么选 IG50免费开源股票数据API接口
clickhouse·sqlite·json
葡萄城技术团队2 天前
如何通过 JSON 数据源 / Web API 快速构建轻量级报表(Report)?
前端·json·原型模式
数据狐(Datafox)2 天前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json