五、JSON
1.基本格式:对象是属性、值对的集合。一个对象的开始于“{”,结束于“}”。每一个属性名和值间用“:”提示,属性间用“,”分隔。
数组是有顺序的值的集合。一个数组开始于"[",结束于"]",值之间用","分隔。值可以是引号里的字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套。
例:
var user = {
UserName: "admin",
UserPassword: "adminPass",
"IsManager": 1,
EmployeeName: {FirstName:"kang",LastName:"jianmin"},
RoleList:["Public","SysAdmin"]
};
2.访问方式:(1)点表示法
例:user.UserName
(2)使用属性名
例:user[“UserName”]
3.将字符串转为JSON对象
(1)eval
例:
var userString = "{UserName:\"test\"}";
eval("var userJSON = "+userString);//或var userJSON = eval("(" + userString + ")");
alert(userJSON.UserName);
(2)Function
function strToJson(str) {
return (new Function("return " + str))();
}
var userString = "{UserName:\"test\"}";
var userJSON = strToJson(userString);
alert(userJSON.UserName);
4.JSON转字符串
var data = { host: { url: "ad.market.com", page: [{ name: "all", area: [{ name: "rightbanner", tname: "all", tclass: "none", type: "jpg", ad: [{ url: "abc.gif", width: "", height: "", menu: "red", tran: "", href: "http://music.qq.com", alt: "aaaaaaaaa", target: "_blank", top: "", bottom: "", left: "", right: ""}] }, { name: "leftbanner", tname: "all", tclass: "none", type: "jpg", ad: [{ url: "", width: "", height: "", menu: "red", tran: "", href: "http://music.qq.com", alt: "aaaaaaaaa", target: "_blank", top: "", bottom: "", left: "", right: ""}]}] }, { name: "index.htm", area: [{ name: "rightbanner", tname: "index.htm", tclass: "none", type: "swf", ad: [{ url: "abcdef.swf", width: "", height: "", menu: "red", tran: "", href: "http://music.qq.com", alt: "aaaaaaaaa", target: "_blank", top: "", bottom: "", left: "", right: ""}] }, { name: "leftbanner", tname: "index.htm", tclass: "none", type: "text", ad: [{ url: "", width: "", height: "", menu: "red", tran: "", href: "http://music.qq.com", alt: "aaaaaaaaa", target: "_blank", top: "", bottom: "", left: "", right: "" }, { url: "", width: "", height: "", menu: "red", tran: "", href: "http://music.qq.com", alt: "aaaaaaaaa", target: "_blank", top: "", bottom: "", left: "", right: "" }, { url: "", width: "", height: "", menu: "red", tran: "", href: "http://music.qq.com", alt: "aaaaaaaaa", target: "_blank", top: "", bottom: "", left: "", right: ""}]}]}] }, toString: function() { return obj2str(this) } }
function obj2str(o) {
var r = [];
if (typeof o == "string") return "\"" + o.replace(/([\'\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";
if (typeof o == "object") {
if (!o.sort) {
for (var i in o)
r.push(i + ":" + obj2str(o[i]));
if (!!document.all && !/^\n?function\s*toString\(\)\s*\{\n?\s*\[native code\]\n?\s*\}\n?\s*$/.test(o.toString)) {
r.push("toString:" + o.toString.toString());
}
r = "{" + r.join() + "}"
} else {
for (var i = 0; i < o.length; i++)
r.push(obj2str(o[i]))
r = "[" + r.join() + "]"
}
return r;
}
return o.toString();
}
alert(obj2str(data))
5.DataTable转JSON字符串
public static string DataTable2JSONString(DataTable dt)
{
StringBuilder jSONString = new StringBuilder();
if(dt.Rows.Count <= 0 || dt.Columns.Count <= 0)
{
return "";
}
jSONString.Append("[");
for (int i = 0; i < dt.Rows.Count; i++)
{
jSONString.Append("{");
for (int j = 0; j < dt.Columns.Count - 1; j++)
{
jSONString.Append(dt.Columns[j].ColumnName + ":\"" + dt.Rows[i][j].ToString() + "\",");
}
jSONString.Append(dt.Columns[dt.Columns.Count - 1].ColumnName + ":\"" + dt.Rows[i][dt.Columns.Count - 1].ToString() + "\"");
if (i == dt.Rows.Count - 1)
{
jSONString.Append("}");
}
else
{
jSONString.Append("},");
}
}
jSONString.Append("]");
return jSONString.ToString();
}
6.
XML 与 JSON 之间的重要特征区别
特征 |
XML |
JSON |
数据类型 |
不提供任何数据类型概念。必须依靠 XML
架构来添加类型信息。 |
提供标量数据类型,并能够通过数组和对象表示结构化数据。 |
数组支持 |
必须按照惯例表示数组,例如通过使用外部占位符元素,将数组内容模型化为内部元素。通常,外部元素使用内部元素所用名称的复数形式。 |
本机数组支持 |
对象支持 |
必须按照惯例表示对象,通常通过混合使用属性和元素。 |
本机对象支持 |
null 支持 |
需要对 XML 实例文档中的元素使用 xsi:nil,加上导入对应的命名空间。 |
在本机识别 null 值。 |
注释 |
本机支持,通常通过 API 来提供。 |
不支持。 |
命名空间 |
支持命名空间,消除了组合文档时的名称冲突风险。命名空间还允许对现有基于 XML 的标准进行安全地扩展。 |
无命名空间概念。通常通过嵌套对象或在对象成员名称中使用前缀(实际操作中以前者优先),来避免命名冲突。 |
格式设置决定 |
复杂。需要更多精力来决定如何将应用程序类型映射到 XML 元素和属性。会引起热烈争论,讨论以元素为中心还是以属性为中心的方法更好。 |
简单。为应用程序数据提供更直接的映射。唯一例外是缺少日期/时间文字。 |
大小 |
文档有些冗长,尤其在使用以元素为中心的方法来设置格式时。 |
语法非常简洁,产生的格式化文本中的大部分空间(理所当然)由所代表的数据使用。 |
在 JavaScript 中分析 |
需要 XML DOM 实现和其他应用程序代码,将文本映射回 JavaScript
对象。 |
不需要其他应用程序代码便能够分析文本,可以使用 JavaScript 的 eval 函数。 |
学习曲线 |
通常需要同时使用多种技术:XPath、XML
架构、XSLT、XML
命名空间、DOM 等。 |
非常简单的技术层次,为具有 JavaScript 或其他动态编程语言背景的开发人员所熟悉。 |
XML 与 JSON 之间的支持区别
支持 |
XML |
JSON |
工具 |
具备由众多业界供应商广泛提供的一组成熟工具。 |
尚不具备丰富的工具支持,如编辑器和格式化程序。 |
Microsoft .NET Framework |
.NET Framework 1.0 之后的版本具有非常优秀和成熟的支持。XML
支持作为基类库 (BCL) 的一部分来提供。对于非托管环境,MSXML 可发挥用武之地。 |
目前尚无此功能,作为 ASP.NET
AJAX 一部分的最初实现除外。 |
平台和语言 |
以众多平台和语言(商业和开源实现)提供了各种广泛使用的分析器和格式化程序。 |
在众多平台上以多种语言提供了分析程序和格式化程序。有关完整的参考资料,请查询 json.org。目前的大多数实现都可能是开源项目。 |
集成语言 |
业界供应商当前正在试验语言内的“字面”支持。有关详细信息,请参见 Microsoft
的 LINQ 项目。 |
仅在 JavaScript/ECMAScript 中提供本机支持。 |
0