C# | JSON格式与XML格式互相转换
@[toc]
前言
JSON格式与XML格式是目前互联网上使用最为广泛的数据交换格式之一,而两种格式各自有着自己的特点和优势。
在实际开发中,我们经常需要将数据在不同的系统或模块之间进行传递和转换,而JSON格式和XML格式的互相转换是一项非常基础和必要的技能。
同时,对于需要将数据存储在不同的介质中的应用场景,比如在移动端本地存储数据,或者在服务器端将数据保存到文件或数据库中,也需要将JSON或XML格式进行相应的转换。
因此,熟练掌握JSON与XML格式互相转换的方法对于开发人员来说是非常重要的。在本文中,我们将介绍常用的JSON和XML互相转换的方法及其实现。
JSON转XML(XmlDocument)
将Json格式的数据转为XML不难,我们可以使用JsonConvert类将Json格式的字符串转为JObject对象,然后使用JObject对象中的方法将其转为XML格式的字符串。
实现步骤
第一步:将Json格式的字符串转为JObject对象。
JObject jObject = JObject.Parse(jsonString);
第二步:创建一个XmlDocument对象,通过递归将Json逐级转化为XML格式,并将其添加到XmlDocument对象中。
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Root></Root>");
XmlNode root = xmlDocument.SelectSingleNode("Root");
AddJObjectToXmlNode(jObject, root);
示例代码
完整的代码示例如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string jsonString = "{\"Table\":{\"Row\":[{\"Name\":\"张三\",\"Age\":\"20\"},{\"Name\":\"李四\",\"Age\":\"25\"}]}}";
JObject jObject = JObject.Parse(jsonString);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Root></Root>");
XmlNode root = xmlDocument.SelectSingleNode("Root");
AddJObjectToXmlNode(jObject, root);
Console.WriteLine(xmlDocument.InnerXml);
}
private static void AddJObjectToXmlNode(JObject jObject, XmlNode parent)
{
foreach (var property in jObject.Properties())
{
var name = property.Name;
var value = property.Value;
if (value is JArray)
{
foreach (var item in (JArray)value)
{
if (item is JObject)
{
var objectElement = parent.OwnerDocument.CreateElement(name);
parent.AppendChild(objectElement);
AddJObjectToXmlNode((JObject)item, objectElement);
}
else
{
var textElement = parent.OwnerDocument.CreateElement(name);
textElement.InnerText = item.ToString();
parent.AppendChild(textElement);
}
}
}
else if (value is JObject)
{
var objectElement = parent.OwnerDocument.CreateElement(name);
parent.AppendChild(objectElement);
AddJObjectToXmlNode((JObject)value, objectElement);
}
else
{
var textElement = parent.OwnerDocument.CreateElement(name);
textElement.InnerText = value.ToString();
parent.AppendChild(textElement);
}
}
}
}
JSON转XML(XDocument)
这部分内容更新于2023年5月15日
思路和之前一致,只不过使用的是XDocument来生成XML。
示例代码
这个代码将JSON对象转换为XElement对象,并根据JSON中的字段名生成XML节点。
创建一个XElement对象作为根,然后调用递归方法ConvertJObjectToXElement()来将JSON对象转换为XElement对象。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string jsonString = "{\"Table\":{\"Row\":[{\"Name\":\"张三\",\"Age\":\"20\"},{\"Name\":\"李四\",\"Age\":\"25\"}]}}";
JObject jObject = JObject.Parse(jsonString);
XElement rootElement = new XElement("Root");
ConvertJObjectToXElement(jObject, rootElement);
XDocument xDocument = new XDocument(rootElement);
Console.WriteLine(xDocument.ToString());
}
private static void ConvertJObjectToXElement(JObject jObject, XElement parentElement)
{
foreach (var property in jObject.Properties())
{
var value = property.Value;
var name = property.Name;
if (value is JValue)
{
parentElement.Add(new XElement(name, value.ToString()));
}
else if (value is JObject)
{
var childElement = new XElement(name);
parentElement.Add(childElement);
ConvertJObjectToXElement((JObject)value, childElement);
}
else if (value is JArray)
{
foreach (var arrayValue in (JArray)value)
{
if (arrayValue is JObject)
{
var childElement = new XElement(name);
parentElement.Add(childElement);
ConvertJObjectToXElement((JObject)arrayValue, childElement);
}
else
{
parentElement.Add(new XElement(name, arrayValue.ToString()));
}
}
}
}
}
}
XML转JSON
其实将XML格式的数据转为Json也并不复杂。我们可以先将XML数据读取到DataSet中,然后再使用JsonConvert类将DataSet转为Json格式的字符串。
实现步骤
第一步:创建一个DataSet对象,并使用XmlReader读取XML格式的数据。
DataSet ds = new DataSet();
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
ds.ReadXml(reader);
}
第二步:将DataSet对象转为Json格式的字符串。
string jsonString = JsonConvert.SerializeObject(ds, Formatting.Indented);
示例代码
完整的代码示例如下:
string xmlString = "<Table><Row><Name>张三</Name><Age>20</Age></Row><Row><Name>李四</Name><Age>25</Age></Row></Table>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
string jsonString = JsonConvert.SerializeObject(doc, Newtonsoft.Json.Formatting.Indented);
Console.WriteLine(jsonString);