我开始使用Json.NET将JSON格式的字符串转换为object或反之.我不确定在Json.NET框架中,是否可以将JSON中的字符串转换为XML格式,反之亦然?
是.为了这个精确的目的,使用包含帮助器方法的JsonConvert类:
// To convert an XML node contained in string xml into a JSON string XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); string jsonText = JsonConvert.SerializeXmlNode(doc); // To convert JSON text contained in string json into an XML node XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
这里的文档:使用Json.NET在JSON和XML之间进行转换
是的,你可以做到(我这样做)但是在转换时要注意一些悖论,并妥善处理.您不能自动符合所有接口的可能性,并且控制转换的内置支持有限 - 许多JSON结构和值不能自动双向转换.请记住,我使用Newtonsoft JSON库和MS XML库的默认设置,因此您的里程可能会有所不同:
所有数据都变成了字符串数据(例如,你总是得到"假"而不是假,或者"0"不是0)显然,JavaScript在某些情况下对待这些不同.
如果只有一个或多个XML子元素,则子元素可以成为嵌套对象{}
或嵌套数组[ {} {} ...]
.您将在JavaScript等中使用这两种不同的方式.符合相同模式的XML的不同示例可以通过这种方式生成实际上不同的JSON结构.您可以将属性json:Array ='true'添加到元素中,以便在某些(但不一定是所有)情况下解决此问题.
你的XML必须格式合理,我注意到它不需要完全符合W3C标准,但是1.你必须有一个根元素和2.你不能用数字开始元素名称是两个强制执行的XML标准我在使用Newtonsoft和MS库时发现了.
在旧版本中,Blank元素不会转换为JSON.他们被忽略了.空白元素不会变为"元素":null
一个新的更新改变了这一点(感谢Jon Story指出):https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm
您需要一个将转换为根XML元素的顶级对象,否则解析器将失败.
您的对象名称不能以数字开头,因为它们无法转换为元素(XML在技术上甚至比这更严格)但我可以"逃避"打破其他一些元素命名规则.
请随意提及您注意到的任何其他问题,我已经开发了自己的自定义例程来准备和清理字符串,因为我来回转换.您的情况可能会或可能不会要求准备/清理.正如StaxMan所提到的,你的情况实际上可能需要你在对象之间进行转换......这可能需要适当的接口和一堆case语句/ etc来处理我上面提到的警告.
您也可以使用.NET Framework进行这些转换:
JSON to XML:使用System.Runtime.Serialization.Json
var xml = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader( Encoding.ASCII.GetBytes(jsonString), new XmlDictionaryReaderQuotas()));
XML到JSON:使用System.Web.Script.Serialization
var json = new JavaScriptSerializer().Serialize(GetXmlData(XElement.Parse(xmlString))); private static DictionaryGetXmlData(XElement xml) { var attr = xml.Attributes().ToDictionary(d => d.Name.LocalName, d => (object)d.Value); if (xml.HasElements) attr.Add("_value", xml.Elements().Select(e => GetXmlData(e))); else if (!xml.IsEmpty) attr.Add("_value", xml.Value); return new Dictionary { { xml.Name.LocalName, attr } }; }
我不确定这种转换是否有意义(是的,许多人这样做,但主要是通过圆孔强制方形钉) - 结构阻抗不匹配,转换是有损的.所以我建议反对这种格式到格式的转换.
但是如果你这样做,首先从json转换为object,然后从object转换为xml(反之亦然,反向).进行直接转换会导致输出难看,信息丢失或两者兼而有之.
感谢David Brown的回答.在我的JSON.Net 3.5的情况下,转换方法在JsonConvert静态类下:
XmlNode myXmlNode = JsonConvert.DeserializeXmlNode(myJsonString); // is node not note // or .DeserilizeXmlNode(myJsonString, "root"); // if myJsonString does not have a root string jsonString = JsonConvert.SerializeXmlNode(myXmlNode);
为了不使用外部组件/项目,我搜索了很长时间以找到已接受解决方案的替代代码.由于DynamicJson项目的源代码,我想出了以下内容:
public XmlDocument JsonToXML(string json) { XmlDocument doc = new XmlDocument(); using (var reader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(json), XmlDictionaryReaderQuotas.Max)) { XElement xml = XElement.Load(reader); doc.LoadXml(xml.ToString()); } return doc; }
注意:我想要一个XmlDocument而不是XElement用于xPath目的.此外,这段代码显然只是从JSON到XML,有各种方法可以做相反的事情.
以下是将xml转换为json的完整c#代码
public static class JSon { public static string XmlToJSON(string xml) { XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); return XmlToJSON(doc); } public static string XmlToJSON(XmlDocument xmlDoc) { StringBuilder sbJSON = new StringBuilder(); sbJSON.Append("{ "); XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true); sbJSON.Append("}"); return sbJSON.ToString(); } // XmlToJSONnode: Output an XmlElement, possibly as part of a higher array private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName) { if (showNodeName) sbJSON.Append("\"" + SafeJSON(node.Name) + "\": "); sbJSON.Append("{"); // Build a sorted list of key-value pairs // where key is case-sensitive nodeName // value is an ArrayList of string or XmlElement // so that we know whether the nodeName is an array or not. SortedListchildNodeNames = new SortedList (); // Add in all node attributes if (node.Attributes != null) foreach (XmlAttribute attr in node.Attributes) StoreChildNode(childNodeNames, attr.Name, attr.InnerText); // Add in all nodes foreach (XmlNode cnode in node.ChildNodes) { if (cnode is XmlText) StoreChildNode(childNodeNames, "value", cnode.InnerText); else if (cnode is XmlElement) StoreChildNode(childNodeNames, cnode.Name, cnode); } // Now output all stored info foreach (string childname in childNodeNames.Keys) { List
要将给定的XML字符串转换为JSON,只需调用XmlToJSON()函数,如下所示.
string xml = ""; string json = JSON.XmlToJSON(xml); // json = { "menu": {"id": "file", "popup": { "menuitem": [ {"onclick": "CreateNewDoc()", "value": "New" }, {"onclick": "OpenDoc()", "value": "Open" }, {"onclick": "CloseDoc()", "value": "Close" } ] }, "value": "File" }}