原文:ASP.NET中XML转JSON的方法

许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理。要实现这一点,它们必须将XML格式转换为JSON格式。

XML转JSON代码

  1. private static string XmlToJSON(XmlDocument xmlDoc)
  2. {
  3. StringBuilder sbJSON = new StringBuilder();
  4. sbJSON.Append("{ ");
  5. XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);
  6. sbJSON.Append("}");
  7. return sbJSON.ToString();
  8. }
  9. //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
  10. private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
  11. {
  12. if (showNodeName)
  13. sbJSON.Append("\\"" + SafeJSON(node.Name) + "\\": ");
  14. sbJSON.Append("{");
  15. // Build a sorted list of key-value pairs
  16. //  where   key is case-sensitive nodeName
  17. //          value is an ArrayList of string or XmlElement
  18. //  so that we know whether the nodeName is an array or not.
  19. SortedList childNodeNames = new SortedList();
  20. //  Add in all node attributes
  21. if( node.Attributes!=null)
  22. foreach (XmlAttribute attr in node.Attributes)
  23. StoreChildNode(childNodeNames,attr.Name,attr.InnerText);
  24. //  Add in all nodes
  25. foreach (XmlNode cnode in node.ChildNodes)
  26. {
  27. if (cnode is XmlText)
  28. StoreChildNode(childNodeNames, "value", cnode.InnerText);
  29. else if (cnode is XmlElement)
  30. StoreChildNode(childNodeNames, cnode.Name, cnode);
  31. }
  32. // Now output all stored info
  33. foreach (string childname in childNodeNames.Keys)
  34. {
  35. ArrayList alChild = (ArrayList)childNodeNames[childname];
  36. if (alChild.Count == 1)
  37. OutputNode(childname, alChild[0], sbJSON, true);
  38. else
  39. {
  40. sbJSON.Append(" \\"" + SafeJSON(childname) + "\\": [ ");
  41. foreach (object Child in alChild)
  42. OutputNode(childname, Child, sbJSON, false);
  43. sbJSON.Remove(sbJSON.Length - 2, 2);
  44. sbJSON.Append(" ], ");
  45. }
  46. }
  47. sbJSON.Remove(sbJSON.Length - 2, 2);
  48. sbJSON.Append(" }");
  49. }
  50. //  StoreChildNode: Store data associated with each nodeName
  51. //                  so that we know whether the nodeName is an array or not.
  52. private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
  53. {
  54. // Pre-process contraction of XmlElement-s
  55. if (nodeValue is XmlElement)
  56. {
  57. // Convert  <aa></aa> into "aa":null
  58. //          <aa>xx</aa> into "aa":"xx"
  59. XmlNode cnode = (XmlNode)nodeValue;
  60. if( cnode.Attributes.Count == 0)
  61. {
  62. XmlNodeList children = cnode.ChildNodes;
  63. if( children.Count==0)
  64. nodeValue = null;
  65. else if (children.Count == 1 && (children[0] is XmlText))
  66. nodeValue = ((XmlText)(children[0])).InnerText;
  67. }
  68. }
  69. // Add nodeValue to ArrayList associated with each nodeName
  70. // If nodeName doesn't exist then add it
  71. object oValuesAL = childNodeNames[nodeName];
  72. ArrayList ValuesAL;
  73. if (oValuesAL == null)
  74. {
  75. ValuesAL = new ArrayList();
  76. childNodeNames[nodeName] = ValuesAL;
  77. }
  78. else
  79. ValuesAL = (ArrayList)oValuesAL;
  80. ValuesAL.Add(nodeValue);
  81. }
  82. private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)
  83. {
  84. if (alChild == null)
  85. {
  86. if (showNodeName)
  87. sbJSON.Append("\\"" + SafeJSON(childname) + "\\": ");
  88. sbJSON.Append("null");
  89. }
  90. else if (alChild is string)
  91. {
  92. if (showNodeName)
  93. sbJSON.Append("\\"" + SafeJSON(childname) + "\\": ");
  94. string sChild = (string)alChild;
  95. sChild = sChild.Trim();
  96. sbJSON.Append("\\"" + SafeJSON(sChild) + "\\"");
  97. }
  98. else
  99. XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);
  100. sbJSON.Append(", ");
  101. }
  102. // Make a string safe for JSON
  103. private static string SafeJSON(string sIn)
  104. {
  105. StringBuilder sbOut = new StringBuilder(sIn.Length);
  106. foreach (char ch in sIn)
  107. {
  108. if (Char.IsControl(ch) || ch == '\\'')
  109. {
  110. int ich = (int)ch;
  111. sbOut.Append(@"\\u" + ich.ToString("x4"));
  112. continue;
  113. }
  114. else if (ch == '\\"' || ch == '\\\\' || ch == '/')
  115. {
  116. sbOut.Append('\\\\');
  117. }
  118. sbOut.Append(ch);
  119. }
  120. return sbOut.ToString();
  121. }

ASP.NET中XML转JSON的方法的更多相关文章

  1. ASP.net中导出Excel的简单方法介绍

    下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...

  2. xml转json的方法

    .第一种方法 使用JSON-JAVA提供的方法,之前一直使用json-lib提供的方法转json,后来发现了这个开源项目,觉得用起来很不错,并且可以修改XML.java中的parse方法满足自己的转换 ...

  3. C#中XML和json互相转换

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xm ...

  4. asp.net中获取当前url的方法

    HttpContext.Current.Request.Url.ToString() 并不可靠. 如果当前URL为 http://localhost/search.aspx?user=http://c ...

  5. 在Asp.Net中使用SmtpMail发送邮件的方法

    在ASP中,就可以通过调用CDONTS组件发送简单邮件,在ASP.Net中,自然也可以.不同的是,.Net Framework中,将这一组件封装到了System.Web.Mail命名空间中. 一个典型 ...

  6. 慎重Asp.net中static变量的使用方法

    在.Net平台下进行CS软件开发时,我们常常遇到以后还要用到某些变量上次改动后的值,为了简单起见,非常多人都习惯用static来定义这些变量,我也是.这样非常方便.下一次调用某个函数时该变量仍然保存的 ...

  7. java中常见的json解析方法、库以及性能对比

    常见的json解析有原生的JSONObject和JSONArray方法,谷歌的GSON库,阿里的fastjson,还有jackson,json-lib. Gson(项目地址:https://githu ...

  8. java 中xml转换为json对象

    1.前提须要jar包: json-lib-2.4-jdk15.jar 和 xom-1.2.5.jar ,maven 仓库: net.sf.json-lib json-lib 2.4 jdk15 xom ...

  9. java中Xml、json之间的相互转换

    旁白: 最近关于xml与json之间的转换都搞蒙了,这里写一个demo,以后备用. 正题: project格式是: jar包是一个一个检出来的,还算干净了. 代码: 工具类: package exer ...

随机推荐

  1. BP简单的理解神经网络

    先用3类样本训练,在測试.. 刚開始学习的人有错的 地方,,请大家多多指导.. 一些好的博客: http://blog.csdn.net/starxu85/article/details/314353 ...

  2. SQL Server BCP使用小结

    原文:SQL Server BCP使用小结 用法: bcp {dbtable )   );GO--输出XML格式化文件--说明一下:-t","是指定字段分隔符,稍后我们会讲到exe ...

  3. 一个Bug的反思

    对输入数据判重,使用Map,将对象作为Key,使用map的containsKey方法来着重是否是重复记录.正常的处理流程:(1)将输入的数据封装成对象(2)判重,将没有重复的数据存储到map(3)对没 ...

  4. oracle HA 高可用性具体解释(之中的一个)

    oracle HA 高可用性具体解释(之二,深入解析TAF,以及HA框架) :http://blog.csdn.net/panfelix/article/details/38436197 一.HA F ...

  5. springMVC框架建设进程

    1.创建Dynamic Web Project 2.导入spring和springmvc所须要的文件 3.配置web.xml文件 3.1 监听spring上下文容器 3.2 载入spring的xml文 ...

  6. ABP应用层——审计日志

    ABP应用层——审计日志 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之19.ABP应用层——审计日志 ABP是“ASP.NET Boilerplate Pro ...

  7. C#开发人员能够可视化操作windows服务

    使用C#开发自己的定义windows服务是一个很简单的事.因此,当.我们需要发展自己windows它的服务.这是当我们需要有定期的计算机或运行某些程序的时候,我们开发.在这里,我有WCF监听案例,因为 ...

  8. ABP领域层——领域事件(Domain events)

    ABP领域层——领域事件(Domain events) 基于DDD的现代ASP.NET开发框架--ABP系列之14.ABP领域层——领域事件(Domain events) ABP是“ASP.NET B ...

  9. SSIS从理论到实战,再到应用(4)----流程控制之For循环

    原文:SSIS从理论到实战,再到应用(4)----流程控制之For循环 上期回顾: SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器 在SSIS体系中,控制流可能经常会遇到 ...

  10. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言     去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...