本文详细解析JavaScript中JS对象与JSON格式字符串的相互转换方法。重点介绍JSON.parse和eval两种解析JSON字符串的方式,以及JSON.stringify序列化JS对象时的行为。特别指出属性名包含特殊字符时的处理规则,以及函数和undefined值在序列化时被忽略的特性。
JSON格式字符串的定义与识别
首先,我们探讨JavaScript中JSON格式字符串的概念。
var JSONStr1 = "{\"name\" : \"张三\"}";
需注意的是,以下示例并非JavaScript中的JSON格式字符串,而仅仅是普通的JS字符串。
var JSONStr2 = "{'name' : '张三'}";
依据JSON语法对字符串的定义:它是由双引号包裹的任意数量Unicode字符集合,并支持反斜线转义。一个字符对应一个单独的字符串。
JSON字符串转换为JS对象的方法
接下来介绍在JavaScript中将JSON格式字符串转换为JS对象的方法。
var jsObj3 = eval("(" + JSONStr1 + ")");
var jsObj4 = JSON.parse(JSONStr1);
建议采用第二种方式,具体原因请参阅:http://www.json.org.cn/resource/json-in-javascript.htm
另外说明,通过这两种方式转换得到的JS对象,应为“符合JSON数据格式的JS对象”,即其属性带有引号。这仅是我的推测,假设JSON格式字符串表示如下:
var JSONStr1 = "{\"f[name]\" : \"张三\"}";
若JSON格式字符串如上所示,则转换后的JS对象属性必须加引号,因为JS对象属性不加引号时仅能使用字母、数字、下划线和$符号,其他符号需加引号。因此,在JS对象字面量表示法中,属性加引号是安全的。此外,若JSON格式字符串如上,对f[name]取值不能使用jsObj4.f[name],而应使用jsObj4['f[name]'],因含特殊字符,请留意。若读者对我的推测有异议,欢迎提出。
JS对象转换为JSON字符串的规则
我们再来看JavaScript中JS对象与JSON格式字符串的相互转换。此处准备了几组JS对象进行说明:
<input type="button" value="测试按钮1" onclick="testJson();"/>
<script type="text/javascript">
//(1) 这是一个js对象
var jsObj1 = {
name : "张三"
}
//(2)这是一个内部带有方法js对象。
var jsObj2 = {
name : "张三",
func : function(){
alert("hello");
}
}
//(3)这是一个符合JSON数据格式的js对象
var jsonObj = {
"name" : "张三",
"age" : 10,
"remark" : {"high" :170,"address" : "beijingshi"}
}
// js数组对象
var jsArray = [
{name : "张三"},
{"age" : 10}
]
function testJson(){
var JSONstr1 = JSON.stringify(jsObj1);
var JSONstr2 = JSON.stringify(jsObj2);
var JSONstr3 = JSON.stringify(jsonObj);
var JSONstr4 = JSON.stringify(jsArray);
alert(JSONstr1);
alert(JSONstr2);
alert(JSONstr3);
alert(JSONstr4);
}
查看弹窗内容:
(1) (2)

(3) (4)
其中(1)、(3)、(4)的执行结果表明,JSON解析器的stringify()函数对JS对象是否符合JSON格式无限制,均可将JS对象转换为JSON格式字符串。
(2)的执行结果表明,若JS对象中不含JSON表示的值(如函数和undefined),则会被排除。
以上就是本文的全部内容,希望对您的学习有所帮助,也希望大家多多支持本站。