Fork Me

JSON or PHP

mY JSON 记录…

什么是JSON?

  1. JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  2. JSON 是轻量级的文本数据交换格式
  3. JSON 独立于语言
  4. JSON 具有自我描述性,更易理解

JSON语法规则

参考理解JSON,从结构上看,所有的数据(data)最终都可以分解成三种类型:

第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如”北京”这个单独的词。
第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如”北京,上海”。
第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如”首都:北京”。

理解1:

  1. 并列的数据之间用逗号(”, “)分隔。
  2. 映射用冒号(”: “)表示。
  3. 并列数据的集合(数组)用方括号(“[]”)表示。
  4. 映射的集合(对象)用大括号(”{}”)表示。

理解2:

  1. 数据由逗号分隔
  2. 数据在名称/值对中
  3. 方括号保存数组
  4. 花括号保存对象

JSON值

JSON值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

PHP中使用JSON

json_encode()

json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。

1
string json_encode ( $value [, $options = 0 ] )

value: 要编码的值。该函数只对 UTF-8 编码的数据有效,否则会得到空字符或者null。
options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT

json_decode()

json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。

1
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])

json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
depth: 整数类型的参数,它指定递归深度
options: JSON解码的掩码选项。 现在有两个支持的选项。 第一个是JSON_BIGINT_AS_STRING, 用于将大整数转为字符串而非默认的float类型。第二个是 JSON_OBJECT_AS_ARRAY, 与将assoc设置为 TRUE 有相同的效果。

PHP示例

附带:

1
2
3
4
5
6
7
8
9
10
11
12
function dump($varVal, $isExit = FALSE){
ob_start();
var_dump($varVal);
$varVal = ob_get_clean();
$varVal = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $varVal);
echo '<pre style="font-size: 16px">'.$varVal.'</pre>';
$isExit && exit();
}
function p_echo($str){
echo '<pre style="font-size: 16px">'.$str.'</pre>';
}

对象

tips: 创建空对象的三种方法

  • $empty_object=(object)array();
  • $empty_object=(object)null;
  • $empty_object = new stdClass();
1
2
3
4
5
6
7
8
9
10
11
12
13
$obj = new stdClass();
$obj->body = 'author';
$obj->id = 123;
$obj->prict = 10.55;
$obj->return = true;
$obj->name = null;
//dump($obj);
p_echo('编码:');
p_echo(json_encode($obj));
p_echo('解码:(数组或对象)');
dump(json_decode(json_encode($obj)));
dump(json_decode(json_encode($obj),true));

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
编码:
{"body":"author","id":123,"prict":10.55,"return":true,"name":null}
解码:(数组或对象)
object(stdClass)#2 (5) {
["body"] => string(6) "author"
["id"] => int(123)
["prict"] => float(10.55)
["return"] => bool(true)
["name"] => NULL
}
array(5) {
["body"] => string(6) "author"
["id"] => int(123)
["prict"] => float(10.55)
["return"] => bool(true)
["name"] => NULL
}

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
p_echo('索引数组:');
$arr = array('one','two','three');
p_echo(json_encode($arr));
p_echo('将"索引数组"强制转化成"对象" : (两种方式)');
p_echo(json_encode( (object)$arr ));
p_echo(json_encode($arr,JSON_FORCE_OBJECT ));
dump(json_decode(json_encode($arr),true));
p_echo('关联数组:');
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
p_echo(json_encode($arr));
dump(json_decode(json_encode($arr),JSON_OBJECT_AS_ARRAY));

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
索引数组:
["one","two","three"]
"索引数组"强制转化成"对象" : (两种方式)
{"0":"one","1":"two","2":"three"}
{"0":"one","1":"two","2":"three"}
array(3) {
[0] => string(3) "one"
[1] => string(3) "two"
[2] => string(5) "three"
}
关联数组:
{"a":1,"b":2,"c":3,"d":4,"e":5}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

中文测试

1
2
3
4
5
$arr = array('你'=>'好','地球online'=>'生存即使命');
p_echo(json_encode($arr));
p_echo(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
dump(json_decode(json_encode($arr),true));

输出结果:

1
2
3
4
5
6
{"\u4f60":"\u597d","\u5730\u7403online":"\u751f\u5b58\u5373\u4f7f\u547d"}
{"你":"好","地球online":"生存即使命"}
array(2) {
["你"] => string(3) "好"
["地球online"] => string(15) "生存即使命"
}

json_decode,JSON_BIGINT_AS_STRING测试

1
2
3
4
5
6
7
8
9
10
11
$json = '{"number": 12345678901234.567890}';
dump(json_decode($json,true));
dump(json_decode($json,true,512,JSON_BIGINT_AS_STRING));
输出结果:
array(1) {
["number"] => float(12345678901235)
}
array(1) {
["number"] => float(12345678901235)
}
1
2
3
4
5
6
7
8
9
10
$json = '{"number": 12345678901234567890}';
dump(json_decode($json,true));
dump(json_decode($json,true,512,JSON_BIGINT_AS_STRING));
输出结果:
array(1) {
["number"] => float(1.2345678901235E+19)
}
array(1) {
["number"] => string(20) "12345678901234567890"
}

假如预期结果是 12345678901234.567890

1
2
3
4
5
6
7
#加上双引号,string类型
$json = '{"number": "12345678901234.567890"}';
dump(json_decode($json,true));
输出结果:
array(1) {
["number"] => string(21) "12345678901234.567890"
}

备注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#索引数组使用json_encode:
["one","two","three"]
#关联数组使用json_encode:
{"a":1,"b":2,"c":3,"d":4,"e":5}
#将"索引数组"强制转化成"对象":
json_encode( (object)$arr )
json_encode($arr,JSON_FORCE_OBJECT )
#结果:
{"0":"one","1":"two","2":"three"}
#JSON_UNESCAPED_UNICODE(中文不转为unicode ,对应的数字 256)
#JSON_UNESCAPED_SLASHES (不转义反斜杠,对应的数字 64)
#同时使用方法:
json_encode($arr,320)
json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)

参考

在PHP语言中使用JSON
数据类型和Json格式
JSON中文手册