博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在ASP.NET中用C#将XML转换成JSON
阅读量:5749 次
发布时间:2019-06-18

本文共 9958 字,大约阅读时间需要 33 分钟。

本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用。或许你可以直接利用JavaScript代码通过Ajax的方式来读取XML,然后直接对其中的内容进行解析,这样或许更直接一些。但本文中给出的代码旨在说明如何通过原生的C#代码来完成这一转换。除此之外,你仍然可以借用一些第三方类库或者更高级一些的.NET库对象来实施转换。我们来看看这里介绍的一些较为简单的方法,但前提是你必须拥有可支持的类库和对象以备使用。

  • 使用Json.NET类库

  前提是需要首先下载和安装Json.NET类库,在这里可以找到

  下面是一个例子:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using Newtonsoft.Json;namespace JSonConverter{    class Program    {        static void Main(string[] args)        {            string xml = "
Test class
100
200
"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc); Console.WriteLine("XML -> JSON: {0}", json); Console.ReadLine(); } }}
  • 使用.NET Framework中的类

  首先需要确保你的工程或服务器支持.NET 4.0或以上版本的Framework,否则无法找到该类。

  下面是一个例子:

using System;using System.Linq;using System.Web.Script.Serialization;using System.Xml.Linq;class Program{    static void Main()    {        var xml =         @"
True
Hello World
999
"; var dic = XDocument .Parse(xml) .Descendants("Column") .ToDictionary( c => c.Attribute("Name").Value, c => c.Value ); var json = new JavaScriptSerializer().Serialize(dic); Console.WriteLine(json); }}

  其输出结果为:{

"key1":"True","key2":"Hello World","key3":"999"}

  可能还会有更多的方法,这里不一一列出了。那么如何使用原生的C#代码将XML转换成JSON格式字符串呢?或者说该C#代码在较低版本的.NET Framework中也可以运行呢?来看看下面的介绍吧。

Introduction

  是一个轻量级的数据交换格式,它可以非常容易地被页面的JavaScript编码为对象的形式,从而方便数据操作。

  基于AJAX的页面使用XmlHttpRequest对象从服务端接收数据来响应用户的请求,当返回的数据是XML格式时,它可以被转换为JSON格式的字符串从而通过JavaScript更加容易地对数据进行处理。

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

Code Description

  代码中提供了一个方法XmlToJSON,可以用来将XmlDocument对象转换为JSON字符串。代码通过迭代每一个XML节点、属性以及子节点,来创建对应的JSON对象。

  • 代码不会生成数字和布尔类型的值
  • Xml DocumentElement对象始终会被转换为JSON对象的member:object,它遵循下面这些规则。
  • 节点的属性会被对应地转换为JSON对象的成员"attr_name":"attr_value"。如:
    XML JSON
    <xx yy='nn'></xx> { "xx" : { "yy" : "nn" } }
    <xx yy=''></xx> { "xx" : { "yy" : "" } }
  • 没有子节点、属性和内容的节点被转换为成员"child_name":null
    XML JSON
    <xx/> { "xx" : null }
  • 没有子节点和属性,但是有内容的节点被转换为成员"child_name":"child_text"
    XML JSON
    <xx>yyy</xx> { "xx" : "yyy" }
  • 其它节点和属性会被适当地转换为"child_name":对象或者"child_name":[elements]对象数组,节点的值会被转换为对象成员的"value",如:
    XML JSON
    <xx yy='nn'><mm>zzz</mm></xx> { "xx" : { "yy" : "nn", "mm" : "zzz" } }
    <xx yy='nn'><mm>zzz</mm><mm>aaa</mm></xx> { "xx" : { "yy" : "nn", "mm" : [ "zzz", "aaa" ] } }
    <xx><mm>zzz</mm>some text</xx> { "xx" : { "mm" : "zzz", "value" : "some text" } }
    <xx value='yyy'>some text<mm>zzz</mm>more text</xx> { "xx" : { "mm" : "zzz", "value" : [ "yyy", "some text", "more text" ] } }
  • 字符会被安全地转换为JSON字符串。注意该转换不会保证你的JavaScript代码不会受到任何注入攻击,如果其中的内容来自于一段不安全的XML数据源的话。下面这个例子演示了字符的转义:
    XML JSON
    <aa>/z'z''z\yyy</aa> { "aa" : "\/z\u0027z\''z\\yyy" }

   在某些特殊的环境下,例如下面的代码,可能需要你自己对反斜线进行转义。

string JSON = XmlToJSON(doc);JSON = JSON.Replace(@"\", @"\\");

  注意,在页面上使用任何未经检查的XML数据时都会存在安全隐患。

Example

XML输入:

JSON输出(对代码进行了格式化):

{ "space":  { "name": "Cake Collage",    "frame": [ {"photo": { "img": "cakecollage1.jpg" },                "rule": [ { "type": "F",                            "img": "cakecollage9.jpg",                            "x": "150",                            "y": "0",                            "w": "300",                            "h": "250"                          },                           { "type": "F",                            "img": "cakecollage2.jpg",                            "x": "0",                              "y": "0",                              "w": "150",                              "h": "220"                           }                        ],                "text": { "string": "Browse my cake space" }               },               {
"photo": { "img": "cakecollage2.jpg" }, "rule": [ { "type": "B", "img": "cakecollage1.jpg" }, { "type": "L", "img": "cakecollage3.jpg" } ] } ] }}

  一旦JSON字符串被定义为一个JavaScript对象,如space_DOM,我们便可以在JavaScript代码中使用下面这些对象和属性:

  • space_DOM.space.name
  • space_DOM.space.frame.length
  • space_DOM.space.frame[0].text.string
  • space_DOM.space.frame[0].rule[0].type

  你的JavaScript代码应该可以非常灵活地应对各种情况,如成员不存在、成员只包含value、或成员是一个数组。下面这个函数可以将所有的成员转换成一个数组,从而应对各种不同的情况。

function ObjectToArray( obj){    if( !obj) return new Array();    if( !obj.length) return new Array(obj);    return obj;}space_DOM.space.frame = ObjectToArray(space_DOM.space.frame);

XmlToJSON C# code

  下面给出对应的C#源代码,通过传入的XmlDocument对象将其转换为对应的JSON格式字符串。

private 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 arrayprivate 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. SortedList childNodeNames = 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) { ArrayList alChild = (ArrayList)childNodeNames[childname]; if (alChild.Count == 1) OutputNode(childname, alChild[0], sbJSON, true); else { sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ "); foreach (object Child in alChild) OutputNode(childname, Child, sbJSON, false); sbJSON.Remove(sbJSON.Length - 2, 2); sbJSON.Append(" ], "); } } sbJSON.Remove(sbJSON.Length - 2, 2); sbJSON.Append(" }");}// StoreChildNode: Store data associated with each nodeName// so that we know whether the nodeName is an array or not.private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue){ // Pre-process contraction of XmlElement-s if (nodeValue is XmlElement) { // Convert
into "aa":null //
xx
into "aa":"xx" XmlNode cnode = (XmlNode)nodeValue; if( cnode.Attributes.Count == 0) { XmlNodeList children = cnode.ChildNodes; if( children.Count==0) nodeValue = null; else if (children.Count == 1 && (children[0] is XmlText)) nodeValue = ((XmlText)(children[0])).InnerText; } } // Add nodeValue to ArrayList associated with each nodeName // If nodeName doesn't exist then add it object oValuesAL = childNodeNames[nodeName]; ArrayList ValuesAL; if (oValuesAL == null) { ValuesAL = new ArrayList(); childNodeNames[nodeName] = ValuesAL; } else ValuesAL = (ArrayList)oValuesAL; ValuesAL.Add(nodeValue);}private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName){ if (alChild == null) { if (showNodeName) sbJSON.Append("\"" + SafeJSON(childname) + "\": "); sbJSON.Append("null"); } else if (alChild is string) { if (showNodeName) sbJSON.Append("\"" + SafeJSON(childname) + "\": "); string sChild = (string)alChild; sChild = sChild.Trim(); sbJSON.Append("\"" + SafeJSON(sChild) + "\""); } else XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName); sbJSON.Append(", ");}// Make a string safe for JSONprivate static string SafeJSON(string sIn){ StringBuilder sbOut = new StringBuilder(sIn.Length); foreach (char ch in sIn) { if (Char.IsControl(ch) || ch == '\'') { int ich = (int)ch; sbOut.Append(@"\u" + ich.ToString("x4")); continue; } else if (ch == '\"' || ch == '\\' || ch == '/') { sbOut.Append('\\'); } sbOut.Append(ch); } return sbOut.ToString();}

Using XmlToJSON

  下面的代码演示了如何在ASP.NET 2的页面中使用XmlToJSON()方法。页面上使用了ClientScriptManager对象来作为JavaScript代码的容器。当然,你完全可以使用其它任何方式将所转换的JSON字符串放到前端页面上。通过下面的代码,程序在前端页面上调用一个名为space_processJSON的JavaScript函数,并将JSON字符串作为参数传递给它。

protected void Page_Load(object sender, EventArgs e){    XmlDocument doc = new XmlDocument();    try    {        string path = Server.MapPath(".");        doc.Load(path+"whatever.xml");    }    catch (Exception ex)    {        lblError.Text = ex.ToString();        return;    }    // Convert XML to a JSON string    string JSON = XmlToJSON(doc);        // Replace \ with \\ because string is being decoded twice    JSON = JSON.Replace(@"\", @"\\");        // Insert code to process JSON at end of page    ClientScriptManager cs = Page.ClientScript;    cs.RegisterStartupScript(GetType(), "SpaceJSON", "space_processJSON('" + JSON + "');", true);}

  来看看前端页面上定义的这个JavaScript函数的具体内容。

  原文出处:《》

本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/p/3296148.html,如需转载请自行联系原作者

你可能感兴趣的文章
Socket编程问题小记
查看>>
基于Flask-Angular的项目组网架构与部署
查看>>
一张图道尽程序员的出路
查看>>
redis 常用命令
查看>>
LVS+Keepalived高可用负载均衡集群架构
查看>>
烂泥:kvm安装windows系统蓝屏
查看>>
iPhone开发面试题--葵花宝典
查看>>
EdbMails Convert EDB to PST
查看>>
POJ 2184
查看>>
存储过程简单实例
查看>>
大话 程序猿 眼里的 接口
查看>>
struts2用了哪几种模式
查看>>
replace函数结合正则表达式实现转化成驼峰与转化成连接字符串的方法
查看>>
ubuntu 初学常用命令
查看>>
WCF客户端与服务端通信简单入门教程
查看>>
判断是否含有中文
查看>>
Byte[]、Image、Bitmap 之间的相互转换
查看>>
玩转 React【第02期】:恋上 React 模板 JSX
查看>>
MyEclipse Web开发教程:XML & XML架构(一)
查看>>
linux文件权限与属性的更改
查看>>