short for | : | JavaScript Object Notation |
是什么 ? | : | a lightweight, text-based, easy for humans to read and write, easy for machines to parse and generate, language-independent syntax for defining data interchange formats. It was derived from the JavaScript Programming Language Standard ECMA-262 3rd Edition - December 1999, but is programming language independent. JSON defines a small set of structuring rules for the portable representation of structured data. |
相关标准 | : | RFC4627、ECMA-404 |
相关资源 | : | https://www.json.org |
JSON
是把JavaScript中的Object进行了字符串化,使得它便于在网络中传输。
JSON | 示例 | JavaScript | Java | Objective-C |
---|---|---|---|---|
JSONObject | {key1:value1, key2:value2, ...} | Object | Map | NSDictionary |
JSONArray | [value1, value2, ...] | Array | ArrayList | NSArray |
string | "xxx"、""、null | String | String | NSString |
integer | 10、-10 | Number | int、long | NSInteger |
float | 10.0、-10.0 | Number | float、double | CGFloat |
true | true | true | true | YES |
false | false | false | false | NO |
null | null | null | null | NSNull |
JSONObject
就是用{
和}
扩起来的key-value
对形式的数据。 这种结构在不同的语言中有不同的叫法,比如: 在Objective-C中称为NSDictionary, 在Java中称为Map
, 在JavaScript里就是叫做Object。
JSONObject
中的key
都是字符串,字符串只能使用双引号扩起来
,不能使用单引号扩起来。这一点要特别注意, 虽然JSON
源于JavaScript,在JavaScript里, 字符串既可以使用双引号扩起来,也允许使用单引号扩起来,但是绝大多数语言里不允许字符串使用单引号扩起来的,所以,为了兼容性,这里规定,字符串必须使用双引号扩起来。value
可以是任意类型。
示例:
{
"username": "fpliu",
"age": 18,
"height": 180.5,
"married": false,
"male": true,
"motion": null,
"phones": ["156565059398", "156565059399"]
}
JSONArray
就是数组,这在不同的语言里的中文称呼都是一样的。
JSONArray
里可以放任意相同数据类型的数据。
示例:
[
{
"username": "fpliu",
"age": 18,
"height": 180.5,
"married": false,
"male": true,
"motion": null,
"phones": ["156565059398", "156565059399"]
},
{
"username": "fpliu",
"age": 18,
"height": 180.5,
"married": false,
"male": true,
"motion": null,
"phones": ["156565059398", "156565059399"]
}
]
string
就是字符串,这在不同的语言里的中文称呼都是一样的。
考虑到大部分语言都支持Unicode字符集和UTF-8字符编码。而且不同的语言可能对一些特殊的字符做特殊的处理,所以,JSON
规定:下面的字符需要做转义处理:
字符 | Unicode Code Point( 十进制) | 转义后 |
---|---|---|
" | 34 | \" |
\ | 92 | \\ |
/ | 47 | \/ |
\b | 8 | \\b |
\f | 12 | \\f |
\t | 9 | \\t |
\r | 13 | \\r |
\n | 10 | \\n |
非BMP | \uxxxx\uyyyy |
这里要特别注意的是:对于Code Point
为非BMP内的对应字符,需要把他们拆分成两个字符来看待, 比如:U+1F604
这个Code Point
对应于这个emoji, 我们转义的时候,不能转成\u1F604
,而是要转成\ud83d\ude04
。
Java语言对转义的处理示例:
private static String escapeJSONString(String value) {
if (value == null || value == "") return value;
StringBuilder stringBuilder = new StringBuilder();
int length = value.length();
for (int i = 0; i < length; i++) {
char ch = value.charAt(i);
switch (ch) {
case '"': stringBuilder.append("\\\"");break;
case '\\': stringBuilder.append("\\\\");break;
case '/': stringBuilder.append("\\/");break;
case '\t': stringBuilder.append("\\t");break;
case '\r': stringBuilder.append("\\r");break;
case '\n': stringBuilder.append("\\n");break;
case '\b': stringBuilder.append("\\b");break;
case '\f': stringBuilder.append("\\f");break;
default: {
if ((ch >= 0xD800 && ch <= 0xDBFF)
|| (ch >= 0xDC00 && ch <= 0xDFFF)) {
stringBuilder.append("\\u").append(Integer.toHexString(ch));
} else {
stringBuilder.append(ch);
}
}
}
}
return stringBuilder.toString();
}
一个合法的JSON
示例:
{
"a": "\"",
"b": "\\",
"c": "\/",
"d": "\b",
"e": "\f",
"f": "\t",
"g": "\r",
"h": "\n",
"i": "\ud83d\ude04"
}
Number
就是十进制的数字,其实就是数学中的实数。实数分为整数和小数,而且有正、负之分。 对应于计算机编程语言中的整数和浮点数。
Number
也允许使用科学计数法,规则是:[-]<number><e|E>[+|-]<exp>
, 这里的e
或者E
表示的是10
的幂的意思。
这个要特别注意:标准里并没有说这个数的范围,从理论上说是可以无限大的,在使用的过程中要考虑不同语言对于数字支持的最大数进行考虑。
示例:
{
"a": 100,
"b": 1e2,
"c": 1E2,
"d": 0.1,
"e": 1e-1,
"f": 1E-1
"g": -0.25,
"h": -2.5e-1,
"i": -2.5E-1
}
Boolean
类型只有两个字面量:true
和false
。 这个要注意的是:都是小写字母,而且不要用双引号扩起来,否则就变成了字符串了。
示例:
{
"isMarried": false,
"male": true
}
null
这个关键字在很多语言里都存在,通常的意思是指引用不存在,在Java和JavaScript里经常使用。 但是在其他语言里未必存在这个关键字,比如C和C++语言里就没有这个关键字, 它等同于C和C++语言里的NULL
;Objective-C里也没有这个关键字, 它等同于Objective-C里的NSNull,而不是nil。
JSONObject
、JSONArray
、string
都允许取值为null
示例:
{
"data": null
}
https://www.json.org里罗列了各种语言实现的JSON
解析工具,非常多,下面是一些常用的JSON
解析库:
C | |
Objective-C |