本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用。或许你可以直接利用JavaScript代码通过Ajax的方式来读取XML,然后直接对其中的内容进行解析,这样或许更直接一些。但本文中给出的代码旨在说明如何通过原生的C#代码来完成这一转换。除此之外,你仍然可以借用一些第三方类库或者更高级一些的.NET库对象来实施转换。我们来看看这里介绍的一些较为简单的方法,但前提是你必须拥有可支持的类库和对象以备使用。
前提是需要首先下载和安装Json.NET类库,在这里可以找到http://json.codeplex.com/
下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span style="line-height:1.5 !important;">{ </span><span style="color:#0000FF;line-height:1.5 !important;">class</span><span style="line-height:1.5 !important;"> Program { </span><span style="color:#0000FF;line-height:1.5 !important;">static</span> <span style="color:#0000FF;line-height:1.5 !important;">void</span> Main(<span style="color:#0000FF;line-height:1.5 !important;">string</span><span style="line-height:1.5 !important;">[] args) { </span><span style="color:#0000FF;line-height:1.5 !important;">string</span> xml = <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;"><Test><Name>Test class</Name><X>100</X><Y>200</Y></Test></span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">; XmlDocument doc </span>= <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> XmlDocument(); doc.LoadXml(xml); </span><span style="color:#0000FF;line-height:1.5 !important;">string</span> json =<span style="line-height:1.5 !important;"> Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc); Console.WriteLine(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">XML -> JSON: {0}</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">, json); Console.ReadLine(); } } }</span> |
首先需要确保你的工程或服务器支持.NET 4.0或以上版本的Framework,否则无法找到该类。
下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span style="line-height:1.5 !important;">{ </span><span style="color:#0000FF;line-height:1.5 !important;">static</span> <span style="color:#0000FF;line-height:1.5 !important;">void</span><span style="line-height:1.5 !important;"> Main() { </span><span style="color:#0000FF;line-height:1.5 !important;">var</span> xml = <span style="color:#800000;line-height:1.5 !important;">@"</span><span style="color:#800000;line-height:1.5 !important;"><Columns> <Column Name=""key1"" DataType=""Boolean"">True</Column> <Column Name=""key2"" DataType=""String"">Hello World</Column> <Column Name=""key3"" DataType=""Integer"">999</Column> </Columns></span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">; </span><span style="color:#0000FF;line-height:1.5 !important;">var</span> dic =<span style="line-height:1.5 !important;"> XDocument .Parse(xml) .Descendants(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">Column</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">) .ToDictionary( c </span>=> c.Attribute(<span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">Name</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">).Value, c </span>=><span style="line-height:1.5 !important;"> c.Value ); </span><span style="color:#0000FF;line-height:1.5 !important;">var</span> json = <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> JavaScriptSerializer().Serialize(dic); Console.WriteLine(json); } }</span> |
其输出结果为:{"key1":"True","key2":"Hello World","key3":"999"}
可能还会有更多的方法,这里不一一列出了。那么如何使用原生的C#代码将XML转换成JSON格式字符串呢?或者说该C#代码在较低版本的.NET Framework中也可以运行呢?来看看下面的介绍吧。
Introduction
JSON是一个轻量级的数据交换格式,它可以非常容易地被页面的JavaScript编码为对象的形式,从而方便数据操作。
基于AJAX的页面使用XmlHttpRequest对象从服务端接收数据来响应用户的请求,当返回的数据是XML格式时,它可以被转换为JSON格式的字符串从而通过JavaScript更加容易地对数据进行处理。
许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理。要实现这一点,它们必须将XML格式转换为JSON格式。下面的ASP.NET C#代码实现了这一过程。
Code Description
代码中提供了一个方法XmlToJSON,可以用来将XmlDocument对象转换为JSON字符串。代码通过迭代每一个XML节点、属性以及子节点,来创建对应的JSON对象。
XML | JSON |
<xx yy=’nn'></xx> | { "xx" : { "yy" : "nn" } } |
<xx yy="></xx> | { "xx" : { "yy" : "" } } |
XML | JSON |
<xx/> | { "xx" : null } |
XML | JSON |
<xx>yyy</xx> | { "xx" : "yyy" } |
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" ] } } |
XML | JSON |
<aa>/z’z"z\yyy</aa> | { "aa" : "\/z\u0027z\"z\\yyy" } |
在某些特殊的环境下,例如下面的代码,可能需要你自己对反斜线进行转义。
1 2 |
<span style="color:#0000FF;line-height:1.5 !important;">string</span> JSON =<span style="line-height:1.5 !important;"> XmlToJSON(doc); JSON </span>= JSON.Replace(<span style="color:#800000;line-height:1.5 !important;">@"</span><span style="color:#800000;line-height:1.5 !important;">\</span><span style="color:#800000;line-height:1.5 !important;">"</span>, <span style="color:#800000;line-height:1.5 !important;">@"</span><span style="color:#800000;line-height:1.5 !important;">\\</span><span style="color:#800000;line-height:1.5 !important;">"</span>); |
注意,在页面上使用任何未经检查的XML数据时都会存在安全隐患。
Example
XML输入:
JSON输出(对代码进行了格式化):
1 2 3 4 5 6 7 8 9 10 11 |
<span style="line-height:1.5 !important;"> { </span>"name": "Cake Collage"<span style="line-height:1.5 !important;">, </span>"frame": [ {"photo": { "img": "cakecollage1.jpg"<span style="line-height:1.5 !important;"> }, </span>"rule": [ { "type": "F"<span style="line-height:1.5 !important;">, </span>"img": "cakecollage9.jpg"<span style="line-height:1.5 !important;">, </span>"x": "150"<span style="line-height:1.5 !important;">, </span>"y": "0"<span style="line-height:1.5 !important;">, </span>"w": "300"<span style="line-height:1.5 !important;">, </span>"h": "250"<span style="line-height:1.5 !important;"> }, { </span>"type": "F"<span style="line-height:1.5 !important;">, </span>"img": "cakecollage2.jpg"<span style="line-height:1.5 !important;">, </span>"x": "0"<span style="line-height:1.5 !important;">, </span>"y": "0"<span style="line-height:1.5 !important;">, </span>"w": "150"<span style="line-height:1.5 !important;">, </span>"h": "220"<span style="line-height:1.5 !important;"> } ], </span>"text": { "string": "Browse my cake space"<span style="line-height:1.5 !important;"> } }, {</span>"photo": { "img": "cakecollage2.jpg"<span style="line-height:1.5 !important;"> }, </span>"rule": [ { "type": "B", "img": "cakecollage1.jpg"<span style="line-height:1.5 !important;"> }, { </span>"type": "L", "img": "cakecollage3.jpg"<span style="line-height:1.5 !important;"> } ] } ] } }</span> |
一旦JSON字符串被定义为一个JavaScript对象,如space_DOM,我们便可以在JavaScript代码中使用下面这些对象和属性:
你的JavaScript代码应该可以非常灵活地应对各种情况,如成员不存在、成员只包含value、或成员是一个数组。下面这个函数可以将所有的成员转换成一个数组,从而应对各种不同的情况。
1 2 3 4 |
<span style="line-height:1.5 !important;">{ </span><span style="color:#0000FF;line-height:1.5 !important;">if</span>( !obj) <span style="color:#0000FF;line-height:1.5 !important;">return</span> <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> Array(); </span><span style="color:#0000FF;line-height:1.5 !important;">if</span>( !obj.length) <span style="color:#0000FF;line-height:1.5 !important;">return</span> <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> Array(obj); </span><span style="color:#0000FF;line-height:1.5 !important;">return</span><span style="line-height:1.5 !important;"> obj; } space_DOM.space.frame </span>= ObjectToArray(space_DOM.space.frame); |
XmlToJSON C# code
下面给出对应的C#源代码,通过传入的XmlDocument对象将其转换为对应的JSON格式字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<span style="line-height:1.5 !important;">{ StringBuilder sbJSON </span>= <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> StringBuilder(); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">{ </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, </span><span style="color:#0000FF;line-height:1.5 !important;">true</span><span style="line-height:1.5 !important;">); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">}</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); </span><span style="color:#0000FF;line-height:1.5 !important;">return</span><span style="line-height:1.5 !important;"> sbJSON.ToString(); } </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> XmlToJSONnode: Output an XmlElement, possibly as part of a higher array</span> <span style="color:#0000FF;line-height:1.5 !important;">private</span> <span style="color:#0000FF;line-height:1.5 !important;">static</span> <span style="color:#0000FF;line-height:1.5 !important;">void</span> XmlToJSONnode(StringBuilder sbJSON, XmlElement node, <span style="color:#0000FF;line-height:1.5 !important;">bool</span><span style="line-height:1.5 !important;"> showNodeName) { </span><span style="color:#0000FF;line-height:1.5 !important;">if</span><span style="line-height:1.5 !important;"> (showNodeName) sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\"</span><span style="color:#800000;line-height:1.5 !important;">"</span> + SafeJSON(node.Name) + <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\": </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">{</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Build a sorted list of key-value pairs </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> where key is case-sensitive nodeName </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> value is an ArrayList of string or XmlElement </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> so that we know whether the nodeName is an array or not.</span> SortedList childNodeNames = <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> SortedList(); </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Add in all node attributes</span> <span style="color:#0000FF;line-height:1.5 !important;">if</span>( node.Attributes!=<span style="color:#0000FF;line-height:1.5 !important;">null</span><span style="line-height:1.5 !important;">) </span><span style="color:#0000FF;line-height:1.5 !important;">foreach</span> (XmlAttribute attr <span style="color:#0000FF;line-height:1.5 !important;">in</span><span style="line-height:1.5 !important;"> node.Attributes) StoreChildNode(childNodeNames,attr.Name,attr.InnerText); </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Add in all nodes</span> <span style="color:#0000FF;line-height:1.5 !important;">foreach</span> (XmlNode cnode <span style="color:#0000FF;line-height:1.5 !important;">in</span><span style="line-height:1.5 !important;"> node.ChildNodes) { </span><span style="color:#0000FF;line-height:1.5 !important;">if</span> (cnode <span style="color:#0000FF;line-height:1.5 !important;">is</span><span style="line-height:1.5 !important;"> XmlText) StoreChildNode(childNodeNames, </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">value</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">, cnode.InnerText); </span><span style="color:#0000FF;line-height:1.5 !important;">else</span> <span style="color:#0000FF;line-height:1.5 !important;">if</span> (cnode <span style="color:#0000FF;line-height:1.5 !important;">is</span><span style="line-height:1.5 !important;"> XmlElement) StoreChildNode(childNodeNames, cnode.Name, cnode); } </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Now output all stored info</span> <span style="color:#0000FF;line-height:1.5 !important;">foreach</span> (<span style="color:#0000FF;line-height:1.5 !important;">string</span> childname <span style="color:#0000FF;line-height:1.5 !important;">in</span><span style="line-height:1.5 !important;"> childNodeNames.Keys) { ArrayList alChild </span>=<span style="line-height:1.5 !important;"> (ArrayList)childNodeNames[childname]; </span><span style="color:#0000FF;line-height:1.5 !important;">if</span> (alChild.Count == <span style="color:#800080;line-height:1.5 !important;">1</span><span style="line-height:1.5 !important;">) OutputNode(childname, alChild[</span><span style="color:#800080;line-height:1.5 !important;">0</span>], sbJSON, <span style="color:#0000FF;line-height:1.5 !important;">true</span><span style="line-height:1.5 !important;">); </span><span style="color:#0000FF;line-height:1.5 !important;">else</span><span style="line-height:1.5 !important;"> { sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;"> \"</span><span style="color:#800000;line-height:1.5 !important;">"</span> + SafeJSON(childname) + <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\": [ </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); </span><span style="color:#0000FF;line-height:1.5 !important;">foreach</span> (<span style="color:#0000FF;line-height:1.5 !important;">object</span> Child <span style="color:#0000FF;line-height:1.5 !important;">in</span><span style="line-height:1.5 !important;"> alChild) OutputNode(childname, Child, sbJSON, </span><span style="color:#0000FF;line-height:1.5 !important;">false</span><span style="line-height:1.5 !important;">); sbJSON.Remove(sbJSON.Length </span>- <span style="color:#800080;line-height:1.5 !important;">2</span>, <span style="color:#800080;line-height:1.5 !important;">2</span><span style="line-height:1.5 !important;">); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;"> ], </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); } } sbJSON.Remove(sbJSON.Length </span>- <span style="color:#800080;line-height:1.5 !important;">2</span>, <span style="color:#800080;line-height:1.5 !important;">2</span><span style="line-height:1.5 !important;">); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;"> }</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); } </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> StoreChildNode: Store data associated with each nodeName </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> so that we know whether the nodeName is an array or not.</span> <span style="color:#0000FF;line-height:1.5 !important;">private</span> <span style="color:#0000FF;line-height:1.5 !important;">static</span> <span style="color:#0000FF;line-height:1.5 !important;">void</span> StoreChildNode(SortedList childNodeNames, <span style="color:#0000FF;line-height:1.5 !important;">string</span> nodeName, <span style="color:#0000FF;line-height:1.5 !important;">object</span><span style="line-height:1.5 !important;"> nodeValue) { </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Pre-process contraction of XmlElement-s</span> <span style="color:#0000FF;line-height:1.5 !important;">if</span> (nodeValue <span style="color:#0000FF;line-height:1.5 !important;">is</span><span style="line-height:1.5 !important;"> XmlElement) { </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Convert <aa></aa> into "aa":null </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> <aa>xx</aa> into "aa":"xx"</span> XmlNode cnode =<span style="line-height:1.5 !important;"> (XmlNode)nodeValue; </span><span style="color:#0000FF;line-height:1.5 !important;">if</span>( cnode.Attributes.Count == <span style="color:#800080;line-height:1.5 !important;">0</span><span style="line-height:1.5 !important;">) { XmlNodeList children </span>=<span style="line-height:1.5 !important;"> cnode.ChildNodes; </span><span style="color:#0000FF;line-height:1.5 !important;">if</span>( children.Count==<span style="color:#800080;line-height:1.5 !important;">0</span><span style="line-height:1.5 !important;">) nodeValue </span>= <span style="color:#0000FF;line-height:1.5 !important;">null</span><span style="line-height:1.5 !important;">; </span><span style="color:#0000FF;line-height:1.5 !important;">else</span> <span style="color:#0000FF;line-height:1.5 !important;">if</span> (children.Count == <span style="color:#800080;line-height:1.5 !important;">1</span> && (children[<span style="color:#800080;line-height:1.5 !important;">0</span>] <span style="color:#0000FF;line-height:1.5 !important;">is</span><span style="line-height:1.5 !important;"> XmlText)) nodeValue </span>= ((XmlText)(children[<span style="color:#800080;line-height:1.5 !important;">0</span><span style="line-height:1.5 !important;">])).InnerText; } } </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Add nodeValue to ArrayList associated with each nodeName </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> If nodeName doesn't exist then add it</span> <span style="color:#0000FF;line-height:1.5 !important;">object</span> oValuesAL =<span style="line-height:1.5 !important;"> childNodeNames[nodeName]; ArrayList ValuesAL; </span><span style="color:#0000FF;line-height:1.5 !important;">if</span> (oValuesAL == <span style="color:#0000FF;line-height:1.5 !important;">null</span><span style="line-height:1.5 !important;">) { ValuesAL </span>= <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> ArrayList(); childNodeNames[nodeName] </span>=<span style="line-height:1.5 !important;"> ValuesAL; } </span><span style="color:#0000FF;line-height:1.5 !important;">else</span><span style="line-height:1.5 !important;"> ValuesAL </span>=<span style="line-height:1.5 !important;"> (ArrayList)oValuesAL; ValuesAL.Add(nodeValue); } </span><span style="color:#0000FF;line-height:1.5 !important;">private</span> <span style="color:#0000FF;line-height:1.5 !important;">static</span> <span style="color:#0000FF;line-height:1.5 !important;">void</span> OutputNode(<span style="color:#0000FF;line-height:1.5 !important;">string</span> childname, <span style="color:#0000FF;line-height:1.5 !important;">object</span> alChild, StringBuilder sbJSON, <span style="color:#0000FF;line-height:1.5 !important;">bool</span><span style="line-height:1.5 !important;"> showNodeName) { </span><span style="color:#0000FF;line-height:1.5 !important;">if</span> (alChild == <span style="color:#0000FF;line-height:1.5 !important;">null</span><span style="line-height:1.5 !important;">) { </span><span style="color:#0000FF;line-height:1.5 !important;">if</span><span style="line-height:1.5 !important;"> (showNodeName) sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\"</span><span style="color:#800000;line-height:1.5 !important;">"</span> + SafeJSON(childname) + <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\": </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">null</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); } </span><span style="color:#0000FF;line-height:1.5 !important;">else</span> <span style="color:#0000FF;line-height:1.5 !important;">if</span> (alChild <span style="color:#0000FF;line-height:1.5 !important;">is</span> <span style="color:#0000FF;line-height:1.5 !important;">string</span><span style="line-height:1.5 !important;">) { </span><span style="color:#0000FF;line-height:1.5 !important;">if</span><span style="line-height:1.5 !important;"> (showNodeName) sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\"</span><span style="color:#800000;line-height:1.5 !important;">"</span> + SafeJSON(childname) + <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\": </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); </span><span style="color:#0000FF;line-height:1.5 !important;">string</span> sChild = (<span style="color:#0000FF;line-height:1.5 !important;">string</span><span style="line-height:1.5 !important;">)alChild; sChild </span>=<span style="line-height:1.5 !important;"> sChild.Trim(); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\"</span><span style="color:#800000;line-height:1.5 !important;">"</span> + SafeJSON(sChild) + <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">\"</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); } </span><span style="color:#0000FF;line-height:1.5 !important;">else</span><span style="line-height:1.5 !important;"> XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName); sbJSON.Append(</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">, </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); } </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Make a string safe for JSON</span> <span style="color:#0000FF;line-height:1.5 !important;">private</span> <span style="color:#0000FF;line-height:1.5 !important;">static</span> <span style="color:#0000FF;line-height:1.5 !important;">string</span> SafeJSON(<span style="color:#0000FF;line-height:1.5 !important;">string</span><span style="line-height:1.5 !important;"> sIn) { StringBuilder sbOut </span>= <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> StringBuilder(sIn.Length); </span><span style="color:#0000FF;line-height:1.5 !important;">foreach</span> (<span style="color:#0000FF;line-height:1.5 !important;">char</span> ch <span style="color:#0000FF;line-height:1.5 !important;">in</span><span style="line-height:1.5 !important;"> sIn) { </span><span style="color:#0000FF;line-height:1.5 !important;">if</span> (Char.IsControl(ch) || ch == <span style="color:#800000;line-height:1.5 !important;">'</span><span style="color:#800000;line-height:1.5 !important;">\'</span><span style="color:#800000;line-height:1.5 !important;">'</span><span style="line-height:1.5 !important;">) { </span><span style="color:#0000FF;line-height:1.5 !important;">int</span> ich = (<span style="color:#0000FF;line-height:1.5 !important;">int</span><span style="line-height:1.5 !important;">)ch; sbOut.Append(</span><span style="color:#800000;line-height:1.5 !important;">@"</span><span style="color:#800000;line-height:1.5 !important;">\u</span><span style="color:#800000;line-height:1.5 !important;">"</span> + ich.ToString(<span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">x4</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">)); </span><span style="color:#0000FF;line-height:1.5 !important;">continue</span><span style="line-height:1.5 !important;">; } </span><span style="color:#0000FF;line-height:1.5 !important;">else</span> <span style="color:#0000FF;line-height:1.5 !important;">if</span> (ch == <span style="color:#800000;line-height:1.5 !important;">'</span><span style="color:#800000;line-height:1.5 !important;">\"</span><span style="color:#800000;line-height:1.5 !important;">'</span> || ch == <span style="color:#800000;line-height:1.5 !important;">'</span><span style="color:#800000;line-height:1.5 !important;">\\</span><span style="color:#800000;line-height:1.5 !important;">'</span> || ch == <span style="color:#800000;line-height:1.5 !important;">'</span><span style="color:#800000;line-height:1.5 !important;">/</span><span style="color:#800000;line-height:1.5 !important;">'</span><span style="line-height:1.5 !important;">) { sbOut.Append(</span><span style="color:#800000;line-height:1.5 !important;">'</span><span style="color:#800000;line-height:1.5 !important;">\\</span><span style="color:#800000;line-height:1.5 !important;">'</span><span style="line-height:1.5 !important;">); } sbOut.Append(ch); } </span><span style="color:#0000FF;line-height:1.5 !important;">return</span><span style="line-height:1.5 !important;"> sbOut.ToString(); }</span> |
Using XmlToJSON
下面的代码演示了如何在ASP.NET 2的页面中使用XmlToJSON()方法。页面上使用了ClientScriptManager对象来作为JavaScript代码的容器。当然,你完全可以使用其它任何方式将所转换的JSON字符串放到前端页面上。通过下面的代码,程序在前端页面上调用一个名为space_processJSON的JavaScript函数,并将JSON字符串作为参数传递给它。
1 2 3 4 5 6 7 8 9 |
<span style="line-height:1.5 !important;">{ XmlDocument doc </span>= <span style="color:#0000FF;line-height:1.5 !important;">new</span><span style="line-height:1.5 !important;"> XmlDocument(); </span><span style="color:#0000FF;line-height:1.5 !important;">try</span><span style="line-height:1.5 !important;"> { </span><span style="color:#0000FF;line-height:1.5 !important;">string</span> path = Server.MapPath(<span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">.</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); doc.Load(path</span>+<span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">whatever.xml</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); } </span><span style="color:#0000FF;line-height:1.5 !important;">catch</span><span style="line-height:1.5 !important;"> (Exception ex) { lblError.Text </span>=<span style="line-height:1.5 !important;"> ex.ToString(); </span><span style="color:#0000FF;line-height:1.5 !important;">return</span><span style="line-height:1.5 !important;">; } </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Convert XML to a JSON string</span> <span style="color:#0000FF;line-height:1.5 !important;">string</span> JSON =<span style="line-height:1.5 !important;"> XmlToJSON(doc); </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Replace \ with \\ because string is being decoded twice</span> JSON = JSON.Replace(<span style="color:#800000;line-height:1.5 !important;">@"</span><span style="color:#800000;line-height:1.5 !important;">\</span><span style="color:#800000;line-height:1.5 !important;">"</span>, <span style="color:#800000;line-height:1.5 !important;">@"</span><span style="color:#800000;line-height:1.5 !important;">\\</span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="line-height:1.5 !important;">); </span><span style="color:#008000;line-height:1.5 !important;">//</span><span style="color:#008000;line-height:1.5 !important;"> Insert code to process JSON at end of page</span> ClientScriptManager cs =<span style="line-height:1.5 !important;"> Page.ClientScript; cs.RegisterStartupScript(GetType(), </span><span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">SpaceJSON</span><span style="color:#800000;line-height:1.5 !important;">"</span>, <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">space_processJSON('</span><span style="color:#800000;line-height:1.5 !important;">"</span> + JSON + <span style="color:#800000;line-height:1.5 !important;">"</span><span style="color:#800000;line-height:1.5 !important;">');</span><span style="color:#800000;line-height:1.5 !important;">"</span>, <span style="color:#0000FF;line-height:1.5 !important;">true</span><span style="line-height:1.5 !important;">); }</span> |
来看看前端页面上定义的这个JavaScript函数的具体内容。
1 2 3 4 5 6 7 8 9 10 |
<script type="text/javascript"> <span style="color:#0000FF;line-height:1.5 !important;">function</span><span style="line-height:1.5 !important;"> space_processJSON( JSON) { space_DOM </span>=<span style="line-height:1.5 !important;"> JSON.parseJSON(); </span><span style="color:#0000FF;line-height:1.5 !important;">if</span>( !<span style="line-height:1.5 !important;">space_DOM) { alert(</span>"JSON decode error"<span style="line-height:1.5 !important;">); </span><span style="color:#0000FF;line-height:1.5 !important;">return</span><span style="line-height:1.5 !important;">; } space_DOM.space.frame </span>=<span style="line-height:1.5 !important;"> ObjectToArray(space_DOM.space.frame); space_frameCount </span>=<span style="line-height:1.5 !important;"> space_DOM.space.frame.length; //.. or whatever } </span></script> |
原文出处:《How to convert XML to JSON in ASP.NET C#》
from:http://www.cnblogs.com/jaxu/p/3296148.html