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();
相关推荐
胖头鱼的鱼缸(尹海文)12 小时前
胖头鱼的技术专栏-474 从能跑到能上线:PG SplitJSON 0.2.0 和 0.1.0 差在哪(20261008)
postgresql·json
?? Daisy17 小时前
Claude Code 接入 GPT:settings.json 两种配置方法(2026-10)
gpt·json
小静AI工程实验室20 小时前
Python 爬虫解析 JSON-LD:多块 script、@graph 与坏数据的 9 个边界
爬虫·python·json
goehou2 天前
LLM 结构化输出全解:从 Prompt 约束到 Schema 硬保证,三层实现怎么选
ai·llm·json·agent·教程·结构化输出
独立开发者阿乐2 天前
结构化数据 JSON-LD 实战:让 AI 读懂你的网页
人工智能·json·结构化数据·geo优化·json-ld·ai收录·faqpage
hasty4 天前
policy.xml 在,不代表策略生效:ImageMagick 补丁给安全配置验收的提醒
xml·mysql·安全
liangshanbo12154 天前
高级前端面试题:package.json 常见字段
前端·json
梦帮科技4 天前
【3.0修订版】创世与节点工程:genesis.json 与 node.toml 解剖
数据结构·算法·json·去中心化·区块链·智能合约·信任链
weixin_440730505 天前
内置函数、json文本、pickle二进制
开发语言·python·json
念越5 天前
接口自动化测试从入门到实战:接口用例设计、Requests、Pytest、YAML、JSON Schema 与 Allure 报告
python·测试工具·自动化·json·pytest