什么是JSON
- 1 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
- 2 很容易的进行阅读和编写。
- 3 方便了机器进行解析和生成。
- 4 采用完全独立于程序语言的文本格式。
JSON基于两种结构
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构。
对象:
对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构。
数组:
数组在js中是中括号“[]”括起来的内容,数据结构为["java","javascript","php",...]。
“名称/值”对的集合(A collection of name/value pairs)
。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)
。
值的有序列表(An ordered list of values)
。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)
。
体现形式
对象(object) 是一个无序的“‘名称/值’对”集合。
一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组(array) 是值(value)的有序集合。
一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)
。这些结构可以嵌套。
字符串(string) 是由双引号包围的任意数量Unicode字符的集合
,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
JSON的数值没有使用八进制与十六进制格式。
可以在任意标记之间添加空白。
PHP对变量进行 JSON 编码
函数:json_encode()
普通方式:
$arr = [
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
'e' => 5
];
echo json_encode($arr);
对象转json:
$obj = new StdClass();
$obj->body = 'another post';
$obj->id = 21;
$obj->approved = true;
$obj->favorite_count = 1;
$obj->status = null;
echo json_encode($obj);
// {"body":"another post","id":21,"approved":true,"favorite_count":1,"status":null}
数组转对象:
PHP 5.3.3 +
$arr = [
1,
2,
3
];
echo json_encode($arr);
// [1,2,3]
echo json_encode((object)$arr);
// {"0":1,"1":2,"2":3}
echo json_encode($arr, JSON_FORCE_OBJECT);
// {"0":1,"1":2,"2":3}
输出中文JSON:
以字面编码多字节 Unicode 字符(默认是编码成 \uXXXX)。 PHP 5.4.0 +
$arr = [
'张三',
'李四',
'王五'
];
echo json_encode($arr);
// ["\u5f20\u4e09","\u674e\u56db","\u738b\u4e94"]
echo json_encode($arr, JSON_UNESCAPED_UNICODE);
// ["张三","李四","王五"]
输出中文JSON对象
//中文,json对象
$arr = [
'张三',
'李四',
'王五'
];
echo json_encode($arr);
// ["\u5f20\u4e09","\u674e\u56db","\u738b\u4e94"]
echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
// {"0":"张三","1":"李四","2":"王五"}
浮点值类型保持:
$arr = [
12.3,
99.99,
100.0
];
echo json_encode($arr);
// [12.3,99.99,100]
echo json_encode($arr, JSON_PRESERVE_ZERO_FRACTION);
// [12.3,99.99,100.0]
其他的掩码:
JSON_HEX_TAG (integer)
所有的 < 和 > 转换成 \u003C 和 \u003E。 PHP 5.3.0 +
JSON_HEX_AMP (integer)
所有的 & 转换成 \u0026。 PHP 5.3.0 +
JSON_HEX_APOS (integer)
所有的 ' 转换成 \u0027。 PHP 5.3.0 +
JSON_HEX_QUOT (integer)
所有的 " 转换成 \u0022。 PHP 5.3.0 +
JSON_NUMERIC_CHECK (integer)
将所有数字字符串编码成数字(numbers)。 PHP 5.3.3 +
...
服务端代码
输出JSON到JavaScript程序;
header('Content-type:text/json');
或者
header('content-type:application/json;charset=utf8');
服务端设置 header 头允许AJAX跨域:
header('Content-Type: text/javascript; charset=utf8');
//如果需要设置允许所有域名发起的跨域请求,可以使用通配符 *
header('Access-Control-Allow-Origin: http://www.test.com/');
//表明该响应的有效时间为 86400 秒,也就是 24 小时。
header('Access-Control-Max-Age: 86400 ');
//服务器允许客户端使用指定方法发起请求
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
JSON验证:
function isValidJson($strJson) {
json_decode($strJson);
return (json_last_error() === JSON_ERROR_NONE);
}
json解码:
函数:json_decode()
解码json:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
//解码json
var_dump(json_decode($json));
/*
object(stdClass)[1]
public 'a' => int 1
public 'b' => int 2
public 'c' => int 3
public 'd' => int 4
public 'e' => int 5
*/
解码为数组:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
//转成数组
var_dump(json_decode($json, true));
/*
array (size=5)
'a' => int 1
'b' => int 2
'c' => int 3
'd' => int 4
'e' => int 5
*/
大整型数值:
JSON_BIGINT_AS_STRING
, 用于将大整数转为字符串而非默认的float类型。
$json = '{"number": 12345678901234567890}';
print_r(json_decode($json));
/*
stdClass Object
(
[number] => 1.2345678901235E+19
)
*/
print_r(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));
/*
stdClass Object
(
[number] => 12345678901234567890
)
*/