如何在ASP.NET中用C#将XML转换成JSON
本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用。或许你可以直接利用JavaScript代码通过Ajax的方式来读取XML,然后直接对其中的内容进行解析,这样或许更直接一些。但本文中给出的代码旨在说明如何通过原生的C#代码来完成这一转换。除此之外,你仍然可以借用一些第三方类库或者更高级一些的.NET库对象来实施转换。我们来看看这里介绍的一些较为简单的方法,但前提是你必须拥有可支持的类库和对象以备使用。
- 使用Json.NET类库
前提是需要首先下载和安装Json.NET类库,在这里可以找到http://json.codeplex.com/
下面是一个例子:
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><Name>Test class</Name><X>100</X><Y>200</Y></Test>"; XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc); Console.WriteLine("XML -> JSON: {0}", json);
Console.ReadLine(); }
}
}
- 使用.NET Framework中的JavaScriptSerializer类
首先需要确保你的工程或服务器支持.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 =
@"<Columns>
<Column Name=""key1"" DataType=""Boolean"">True</Column>
<Column Name=""key2"" DataType=""String"">Hello World</Column>
<Column Name=""key3"" DataType=""Integer"">999</Column>
</Columns>";
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
JSON是一个轻量级的数据交换格式,它可以非常容易地被页面的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输入:
<space name="Cake Collage">
<frame>
<photo img="cakecollage1.jpg" />
<text string="Browse my cake space" />
<rule type="F" img="cakecollage9.jpg" x="150" y="0" w="300" h="250" />
<rule type="F" img="cakecollage2.jpg" x="0" y="0" w="150" h="220" />
</frame>
<frame>
<photo img="cakecollage2.jpg" />
<rule type="B" img="cakecollage1.jpg" />
<rule type="L" img="cakecollage3.jpg" />
</frame>
</space>
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 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.
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 == )
OutputNode(childname, alChild[], sbJSON, true);
else
{
sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");
foreach (object Child in alChild)
OutputNode(childname, Child, sbJSON, false);
sbJSON.Remove(sbJSON.Length - , );
sbJSON.Append(" ], ");
}
}
sbJSON.Remove(sbJSON.Length - , );
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 <aa></aa> into "aa":null
// <aa>xx</aa> into "aa":"xx"
XmlNode cnode = (XmlNode)nodeValue;
if( cnode.Attributes.Count == )
{
XmlNodeList children = cnode.ChildNodes;
if( children.Count==)
nodeValue = null;
else if (children.Count == && (children[] is XmlText))
nodeValue = ((XmlText)(children[])).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 JSON
private 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函数的具体内容。
<script src="space/json.js" type="text/javascript"></script> <script type="text/javascript">
function space_processJSON( JSON)
{
space_DOM = JSON.parseJSON();
if( !space_DOM)
{
alert("JSON decode error");
return;
}
space_DOM.space.frame = ObjectToArray(space_DOM.space.frame);
space_frameCount = space_DOM.space.frame.length;
//.. or whatever
}
</script>
原文出处:《How to convert XML to JSON in ASP.NET C#》
如何在ASP.NET中用C#将XML转换成JSON的更多相关文章
- 如何在ASP.NET中用C#将XML转换成JSON 【转】
本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用.或许你可以直接利用JavaScript代码通过Ajax的方 ...
- C#将XML转换成JSON 使用 JavaScript 将 XML 转成 JSON
如何在ASP.NET中用C#将XML转换成JSON [JavaScript]代码 // Changes XML to JSON function xmlToJson(xml) { // Create ...
- C#将XML转换成JSON转换XML
原文:C#将XML转换成JSON转换XML using System; using System.Collections.Generic; using System.Linq; using Syste ...
- 将xml转换成Json,数组,对象格式转换方法
xml字符串:$simplexml 转换成Json格式:json_encode($simplexml) 转换成数组格式:json_decode(json_encode($simplexml),TRUE ...
- 用C#将XML转换成JSON
本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用.或许你可以直接利用JavaScript代码通过Ajax的方式来 ...
- [ActionScript 3.0] AS3 实现XML转换成JSON
package com.fylib.util { /** * @author Frost.Yen * @E-mail 871979853@qq.com * @create 2015-6-18 下午2: ...
- python将xml转换成json数据
# -*- coding: utf-8 -*- import requests import xmltodict import json def get_response(request_url): ...
- 接口测试xml格式转换成json
未经允许,禁止转载!!!! 接口测试一般返回的是xml和json,现在大多数时候是返回成json的格式,但是有时候也会出现xml格式, 由于xml格式的文件阅读起来不是很容易懂,所以尽量将xml转换成 ...
- Dom4j把xml转换成Map(固定格式)
/** * 可解析list * * @param fileName * @return * @throws Exception */ @SuppressWarnings("unchecked ...
随机推荐
- JSON中的日期格式化
Json字符串中的日期格式化函数 ConvertJsonDate: function (jd) { var d = new Date(parseInt(jd.replace("/Date(& ...
- mfc中Button、Edit Control和MFC EditBrowse Control的用法
[前(fei)言(hua)] 写LL(1)分析器被CString转string卡了一个多小时也是醉了. 趁着还算清醒写下这次用到的控件的使用方法好了. 这次实验的mfc用到了四个控件:Edit Con ...
- 01背包问题:POJ3624
背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题. POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案. 我们 ...
- c#开发Mongo笔记第六篇
之前写的五篇比较得到了大家的积极反馈,也有个别高手对我写我写出的代码进行了指教. 其中提到的我写的查询方法性能有问题,我想了想,如果mongo不是延时加载的话,那我的查询就真的有问题了,就成了查询出来 ...
- Ceph分层存储分析
最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1,首先肯定要弄清Ceph分层存储的结构 ,结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O ...
- eclipse 快捷键保存在哪里
eclipse 快捷键文件地址:%Workspace%/.metadata/.plugins/org.eclipse.core.runtime /.settings/org.eclipse.ui.wo ...
- 浅谈.Net WebService开发
一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问并使用在线服务,一些数据,由于安全性问题,不能提供数据库给其他单位使用,这时候可以使 用WebSer ...
- JAVA_BaseDAO数据处理类
package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStat ...
- 不用开发者账号打ipa包
编译一下 , if -> Build Success -> Show in Finder之后,将文件夹里的app直接拖入到iTunes里, 接着再iTunes里选中app -> S ...
- Eclipse程序员要掌握的常用快捷键
Ctrl+K 光标放在一个变量上(注意,是变量,如果你的光标放在了字符串上,如http://keleyi.com则没有任何作用的),按下Ctrl+K光标会定位到下一个相同的变量 Shift+Ctrl+ ...