JSON语法

Javascript 对象表示法 (Javascript Object Notation,简称JSON) 是一种轻量级的数据交换格式,它是一种文本格式,与语言无关;

JSON有六种类型的值:

对象、数组、字符串、数字、布尔值和特殊值 null;

JSON字符串必须是 双引号 的;

数字的整数首位不允许为0,数字可以是整数、实数或科学计数;

空白(空格符、制表符、回车符和换行符)可被插到任何值的前后,不过为了减少传输和存储成本,空白可以省略;

JSON对象是一个容纳 “名/值” 对的无序集合;

  • 名(key),必须是双引号字符串

  • 值(value),可以是任何类型的JSON值,包括数组和对象;

JSON对象可以被无限层地嵌套;但一般应保持其结构的相对扁平是最高效的;

JSON数组是一个值的有序序列;其值可以是任何类型的JSON值,包括数组和对象;

注:最后一项不能有逗号;

例:

[
    {
        "first": "Jerome",
        "middle": "Lester",
        "last": "Howard",
    },
    {
        "first": "Harry",
        "middle": "Moses",
        "last": "Howard",
    },
    {
        "first": "Louis",
        "last": "Feinberg",
    }
]

安全的使用JSON

JSON特别易于用在WEB应用中,因为JSON就是Javascript。

使用 eval() 函数可以把一段JSON文本转化成一个有用的数据结构:

var myDate = eval('(' + myJSONText + ')’);

使用圆括号把 JSON 文本括起来是一种避免 Javascript 语法歧义的变通方案;

使用 eval() 函数有安全问题,所以一般不建议用;

在WEB浏览器中从服务器端获取数据的最佳技术是 XMLHttpRequest

通过使用 JSON.parse() 方法替代 eval() 是一种最佳实践,如果有危险数据 JSON.parse() 将抛出一个异常; !lte7

在外部数据与 innerHTML 进行交互时还存在另一种危险,即如果一个 HTML 文本片段包含一个 <script> 标签,那么一个恶意脚本将被执行;

JS对象与JSON文本相互转换

JSON.stringify() 将 JS 对象 转换为 JSON 字符串

JSON.stringify(value [, replacer] [, space])

参数

value 必选。 JavaScript 值,通常对象或数组,将转换。

replacer 可选。 转换结果的函数或数组。

如果 replacer 函数,调用 JSON.stringify 函数,传入键值和每个成员。 返回值用于代替原始值。 如果函数返回 undefined,成员被排除。 根对象的关键是空字符串:””

如果 replacer 是数组,因此,只有用键值的成员数组中将转换。 成员变换的顺序与键顺序的数组中。 当 value 参数也是 replacer 数组时,数组被忽略。

space 可选。 添加缩进、空白和换行符来返回值 JSON 文本更便于阅读。

如果省略 space,返回值文本生成,没有任何额外的空白。

如果 space 是数字,则返回值具有空白的文本缩进指定数目在每个级别的。 如果 space 大于 10 时,文本缩进 10 个空白。

如果 space 为非空字符串,如“\t”,返回值文本缩进与字符串的字符在每个级别。

如果 space 为大于 10 个字符的字符串,使用前 10 个字符。

如果 value 有一个 toJSON 方法,使用 JSON.stringify 函数返回值的方法。 如果 toJSON 方法的返回值与 undefined成员,不转换。 这使得对象确定自己的 JSON 表示。

没有 JSON 表示形式,如 undefined的值,而不会转换。 在对象,它们将被删除。 在将 null 数组,将其替换。

字符串值以双引号开始和结束。 所有 Unicode 字符括在引号可能除外必须使用反斜杠,转义的字符。 以下字符必须由反斜杠:

  • 引号 (“)
  • 反斜杠 ()
  • 退格 (B)
  • 换页 (f)
  • 换行符 (n)
  • 回车 (r)
  • 横向 (T) 表
  • 四位十六进制数字 (uhhhh)

执行顺序

在序列化进程中,toJSON,则方法以 value 参数,则 JSON.stringify 的第一次调用 toJSON 方法。 如果不存在,则使用值。 接下来,如果,提供 replacer 参数,值 (初始值或 toJSON 返回值) 用 replacer 参数的值替换中返回。 最后,将添加到 space 参数的值基于选项生成最终 JSON 文本。

示例

此示例使用 JSON.stringify 的转换为 JSON 文本的 contact 对象。 memberfilter 数组定义,以便仅 surname 和 phone 成员转换。 firstname 成员省略。

var contact = new Object();
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"];

var memberfilter = new Array();
memberfilter[0] = "surname";
memberfilter[1] = "phone";
var jsonText = JSON.stringify(contact, memberfilter, "\t");
document.write(jsonText);
// Output:
// { "surname": "Aaberg", "phone": [ "555-0100", "555-0120" ] }

此示例使用与数组的 JSON.stringify。 replaceToUpper 函数转换数组中每个字符串为大写。

var continents = new Array();
continents[0] = "Europe";
continents[1] = "Asia";
continents[2] = "Australia";
continents[3] = "Antarctica";
continents[4] = "North America";
continents[5] = "South America";
continents[6] = "Africa";

var jsonText = JSON.stringify(continents, replaceToUpper);

function replaceToUpper(key, value) {
    return value.toString().toUpperCase();
}

//Output:
// "EUROPE,ASIA,AUSTRALIA,ANTARCTICA,NORTH AMERICA,SOUTH AMERICA,AFRICA"

此示例使用 toJSON 方法将字符串值转换为大写。

var contact = new Object();
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"];

contact.toJSON = function(key) {
    var replacement = new Object();
    for (var val in this)
    {
        if (typeof (this[val]) === 'string')
            replacement[val] = this[val].toUpperCase();
        else
            replacement[val] = this[val]
    }
    return replacement;
};

var jsonText = JSON.stringify(contact);
document.write(jsonText);

// Output:
{"firstname":"JESPER","surname":"AABERG","phone":["555-0100","555-0120"]}
'{"firstname":"JESPER","surname":"AABERG","phone":["555-0100","555-0120"]}'

JSON.parse() 将 JSON 字符串转换为 JS 对象

JSON.parse(text [, reviver])

参数

text 必选。 一个有效的 JSON 字符串。
reviver 可选。 一个转换结果的函数。 将为对象的每个成员调用此函数。 如果成员包含嵌套对象,则先于父对象转换嵌套对象。 对于每个成员,会发生以下情况:

  • 如果 reviver 返回一个有效值,则成员值将替换为转换后的值。
  • 如果 reviver 返回它接收的相同值,则不修改成员值。
  • 如果 reviver 返回 null 或 undefined,则删除成员。

示例

以下示例使用 JSON.parse 将 JSON 字符串转换成对象。

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
document.write(contact.surname + ", " + contact.firstname);

// Output: Aaberg, Jesper

以下示例演示了如何使用 JSON.stringify 将数组转换成 JSON 字符串,然后使用 JSON.parse 将该字符串重新转换成数组。

var arr = ["a", "b", "c"];
var str = JSON.stringify(arr);
document.write(str);
document.write ("<br/>");

var newArr = JSON.parse(str);

while (newArr.length > 0) {
    document.write(newArr.pop() + "<br/>");
}


// Output:
// ["a","b","c"]
// c
// b
// a

reviver 函数通常用于将国际标准化组织 (ISO) 日期字符串的 JSON 表示形式转换为协调世界时 (UTC) 格式 Date 对象。 此示例使用 JSON.parse 来反序列化 ISO 格式的日期字符串。

dateReviver函数为格式为 ISO 日期字符串的成员返回Date对象。

var jsontext = '{ "hiredate": "2008-01-01T12:00:00Z", "birthdate": "2008-12-25T12:00:00Z" }';
var dates = JSON.parse(jsontext, dateReviver);
document.write(dates.birthdate.toUTCString());

function dateReviver(key, value) {
    var a;
    if (typeof value === 'string') {
        a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
        if (a) {
            return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
        }
    }
    return value;
};

// Output:
// Thu, 25 Dec 2008 12:00:00 UTC

jQuery.getJSON()

jQuery.getJSON( url [, data ] [, success(data, textStatus, jqXHR) ] )

  • url,类型: String一个包含发送请求的URL字符串
  • data,类型: PlainObject,发送给服务器的字符串或Key/value键值对。
  • success(data, textStatus, jqXHR),类型: Function(),当请求成功后执行的回调函数。

这是一个Ajax函数的缩写,这相当于:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});