之前,米扑博客写过一篇文章:PHP 保持中文编码 json_encode 函数

今天,将详细介绍 PHP 中 json_decode() 和 json_encode() 使用方法

json_decode 字符串转成json格式

json_encode json格式转成字符串

 

1. json_decode() 字符串转json

json_decode  (PHP 5 >= 5.2.0, PECL json >= 1.2.0) 

格式:接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 

mixed json_decode ( string $json [, bool $assoc ] ) 

参数 
json  待解码的 json string 格式的字符串。 
assoc  该参数为 true 时,将返回 array 而非 object,推荐设置为 true 

返回值 
Returns an object or if the optional assoc parameter is TRUE, an associative array is instead returned. 

 

示例:

<?php
$mimvp = '{"blog":"blog.mimvp.com","proxy":"proxy.mimvp.com","money":"money.mimvp.com"}';

	// str to json
	var_dump(json_decode($mimvp));
	var_dump(json_decode($mimvp, true));

	// json to str
	echo json_encode(json_decode($mimvp));
	echo "\n";
	echo json_encode(json_decode($mimvp, true));
	echo "\n";
?>

运行结果:

class stdClass#1 (3) {
  public $blog =>
  string(14) "blog.mimvp.com"
  public $proxy =>
  string(15) "proxy.mimvp.com"
  public $money =>
  string(15) "money.mimvp.com"
}
array(3) {
  'blog' =>
  string(14) "blog.mimvp.com"
  'proxy' =>
  string(15) "proxy.mimvp.com"
  'money' =>
  string(15) "money.mimvp.com"
}
{"blog":"blog.mimvp.com","proxy":"proxy.mimvp.com","money":"money.mimvp.com"}
{"blog":"blog.mimvp.com","proxy":"proxy.mimvp.com","money":"money.mimvp.com"}

结果小结:

json_decode($data, true) 输出的一个关联数组,即 PHP数组或字典

json_decode($data)输出的是对象,不可直接当数组使用

 

 

2. json_encode() json 转字符串

json_encode  (PHP 5 >= 5.2.0, PECL json >= 1.2.0) 

格式:返回 value 值的 JSON 形式 

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

参数 

value  待编码的 value ,除了resource 类型之外,可以为任何数据类型 

该函数只能接受 UTF-8 编码的数据 

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_UNESCAPED_UNICODE. 

返回值 

编码成功则返回一个以 JSON 形式表示的 string 或者在失败时返回 FALSE 。 

更新日志 版本 说明 

5.4.0 options 参数增加常量: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, 和 JSON_UNESCAPED_UNICODE。 
5.3.3 options 参数增加常量:JSON_NUMERIC_CHECK。 
5.3.0 增加 options 参数. 

 

示例:

<?php
	$mimvp = array( "blog"=>"blog.mimvp.com",
	                "proxy"=>"proxy.mimvp.com",
	                "money"=>"money.mimvp.com",
	                );

	echo json_encode($mimvp);
?>

运行结果:

{"blog":"blog.mimvp.com","proxy":"proxy.mimvp.com","money":"money.mimvp.com"}


json_encode() 函数中 options 参数的用法

<?php 
	$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9"); 

	echo "Normal: ", json_encode($a), "\n"; 
	echo "Tags: ", json_encode($a, JSON_HEX_TAG), "\n"; 
	echo "Apos: ", json_encode($a, JSON_HEX_APOS), "\n"; 
	echo "Quot: ", json_encode($a, JSON_HEX_QUOT), "\n"; 
	echo "Amp: ", json_encode($a, JSON_HEX_AMP), "\n"; 
	echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "\n"; 
	echo "All: ", json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "\n\n"; 

	$b = array(); 

	echo "Empty array output as array: ", json_encode($b), "\n"; 
	echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "\n\n"; 

	$c = array(array(1,2,3)); 

	echo "Non-associative array output as array: ", json_encode($c), "\n"; 
	echo "Non-associative array output as object: ", json_encode($c, JSON_FORCE_OBJECT), "\n\n"; 

	$d = array('foo' => 'bar', 'baz' => 'long'); 

	echo "Associative array always output as object: ", json_encode($d), "\n"; 
	echo "Associative array always output as object: ", json_encode($d, JSON_FORCE_OBJECT), "\n\n"; 
?> 

运行结果:

Normal: ["","'bar'","\"baz\"","&blong&","\u00e9"] 
Tags: ["\u003Cfoo\u003E","'bar'","\"baz\"","&blong&","\u00e9"] 
Apos: ["","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"] 
Quot: ["","'bar'","\u0022baz\u0022","&blong&","\u00e9"] 
Amp: ["","'bar'","\"baz\"","\u0026blong\u0026","\u00e9"] 
Unicode: ["","'bar'","\"baz\"","&blong&","é"] 
All: ["\u003Cfoo\u003E","\u0027bar\u0027","\u0022baz\u0022","\u0026blong\u0026","é"] 

Empty array output as array: [] 
Empty array output as object: {} 

Non-associative array output as array: [[1,2,3]] 
Non-associative array output as object: {"0":{"0":1,"1":2,"2":3}} 

Associative array always output as object: {"foo":"bar","baz":"long"} 
Associative array always output as object: {"foo":"bar","baz":"long"} 

 

连续与非连续数组示例 

<?php
    echo"连续数组".PHP_EOL;
    $sequential=array("foo","bar","baz","blong");
    var_dump($sequential,json_encode($sequential));
    
    echo PHP_EOL."非连续数组".PHP_EOL;
    $nonsequential=array(1=>"foo",2=>"bar",3=>"baz",4=>"blong");
    var_dump($nonsequential,json_encode($nonsequential));
    
    echo PHP_EOL."删除一个连续数组值的方式产生的非连续数组".PHP_EOL;
    unset($sequential[1]);
    var_dump($sequential,json_encode($sequential));
?>

运行结果: 

连续数组
array(4) {
  [0] =>
  string(3) "foo"
  [1] =>
  string(3) "bar"
  [2] =>
  string(3) "baz"
  [3] =>
  string(5) "blong"
}
string(27) "["foo","bar","baz","blong"]"

非连续数组
array(4) {
  [1] =>
  string(3) "foo"
  [2] =>
  string(3) "bar"
  [3] =>
  string(3) "baz"
  [4] =>
  string(5) "blong"
}
string(43) "{"1":"foo","2":"bar","3":"baz","4":"blong"}"

删除一个连续数组值的方式产生的非连续数组
array(3) {
  [0] =>
  string(3) "foo"
  [2] =>
  string(3) "baz"
  [3] =>
  string(5) "blong"
}
string(33) "{"0":"foo","2":"baz","3":"blong"}"


可以看出json_encode()和json_decode()是编译和反编译过程,

注意:json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。

 

 

在线工具

在线JSON格式化工具:https://tool.lu

在线JSON格式化工具:http://json.parser.online.fr

在线JSON格式化工具:http://tools.jb51.net/code/json

在线XML/JSON转换:http://tools.jb51.net/code/xmljson

json在线转换工具:http://tools.jb51.net/code/jsoncodeformat

C语言风格/HTML/CSS/json代码格式化美化工具:http://tools.jb51.net/code/ccode_html_css_json

 

 

参考推荐

PHP 保持中文编码 json_encode 函数

PHP中json_decode()和json_encode()的使用方法