您的位置:永利集团登录网址 > 永利集团登录网址 > PHP使用JSON实例分析详解

PHP使用JSON实例分析详解

2019-10-02 14:55

在PHP编码JSON(json_encode)
PHP json_encode()函数用于在PHP JSON编码。这个函数成功返回JSON表示的值,失败则返回FALSE。

从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。

语法:

php中json_decode()和json_encode()

1、json_encode() 该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);

string json_encode ( $value [, $options = 0 ] )参数:
value: 即将编码的值,此函数只适用于UTF-8编码的数据。

1.json_decode()

上面代码的输出结果为:
{"a":1,"b":2,"c":3,"d":4,"e":5}

options: 这个可选的值是一个位掩码,由JSON_HEX_TAG JSON_HEX_QUOT,JSON_HEX_AMP,JSON_HEX_APOS,JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT,JSON_UNESCAPED_SLASHES,JSON_FORCE_OBJECT

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

再看一个对象转换的例子:

例子

json_decode — 对 JSON 格式的字符串进行编码

复制代码 代码如下:

PHP使用JSON实例分析详解。下面的例子演示了如何用PHP数组转换成JSON:

说明
mixed json_decode ( string $json [, bool $assoc ] )
接受一个 JSON 格式的字符串并且把它转换为 PHP 变量

$obj->body = 'another post';
$obj->id = 21;
$obj->approved = true;
$obj->favorite_count = 1;
$obj->status = NULL;
echo json_encode($obj);

 代码如下

参数

以上代码的输出结果为:

<?php
   $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
   echo json_encode($arr);
?>

json
待解码的 json string 格式的字符串。

复制代码 代码如下:

在执行过程中,这将产生以下结果:

assoc
当该参数为 TRUE 时,将返回 array 而非 object 。

{
    "body":"another post",

{"a":1,"b":2,"c":3,"d":4,"e":5}

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

    "id":21,

下面的示例显示如何将PHP对象可以转换成JSON:

范例

    "approved":true,

 代码如下

Example #1 json_decode() 的例子

    "favorite_count":1,

<?php
   class Emp {
       public $name = "";
       public $hobbies  = "";
       public $birthdate = "";
   }
   $e = new Emp();
   $e->name = "sachin";
   $e->hobbies  = "sports";
   $e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
   $e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));

 代码如下

    "status":null
}

   echo json_encode($e);
?>

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>

由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。

在执行过程中,这将产生以下结果:

上例将输出:

2、索引数组和关联数组 PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。

{"name":"sachin","hobbies":"sports","birthdate":"08/05/1974 12:20:03 pm"}

object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

解码JSON在PHP(json_decode) PHP json_decode()函数用于解码JSON在PHP。这个函数返回值从json解码成适当的 PHP类型。

array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

比如,现在有一个索引数组:
$arr = Array('one', 'two', 'three');
echo json_encode($arr);

语法:
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])参数:
json_string: 它必须是UTF-8编码的数据编码的字符串

$data='[{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""}]';
echo json_decode($data);

其输出结果为:
["one","two","three"]

assoc: 这是一个布尔类型参数设置为TRUE时,返回的对象将被转换成关联数组

结果为:

如果将它改为关联数组:
$arr = Array('1'=>'one', '2'=>'two', '3'=>'three');
echo json_encode($arr);

depth: 它是一个整数类型的参数,它指定递归深度

Array ( [0] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) )

结果就变了:
{"1":"one","2":"two","3":"three"}

options: 它是一个整数类型的位掩码JSON解码,支持JSON_BIGINT_AS_STRING

可以看出经过json_decode()编译出来的是对象,现在输出json_decode($data,true)试下

注意,数据格式从"[]"(数组)变成了"{}"(对象)。

例子
下面的示例显示了如何可以使用PHP来解码JSON对象:

 代码如下

如果你需要将"索引数组"强制转化成"对象",可以这样写

 代码如下

echo json_decode($data,true);

json_encode( (object)$arr );
或者:
json_encode ( $arr, JSON_FORCE_OBJECT );

<?php
   $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

结果:

3、类(class)的转换 下面是一个PHP的类:

   var_dump(json_decode($json));
   var_dump(json_decode($json, true));
?>

Array ( [0] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) )

复制代码 代码如下:

在执行过程中,这将产生以下结果:

可以看出 json_decode($data,true)输出的一个关联数组,由此可知json_decode($data)输出的是对象,而json_decode("$arr",true)是把它强制生成PHP关联数组.

class Foo {

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

2.json_encode()

    const ERROR_CODE = '404';

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

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

    public $public_ex = 'this is public';

假如我们获取的JSON数据如下:(可以使用curl、fsockopen等方式获取)

json_encode — 对变量进行 JSON 编码

    private $private_ex = 'this is private!';

 代码如下

Report a bug 说明
string json_encode ( mixed $value [, int $options = 0 ] )
返回 value 值的 JSON 形式

    protected $protected_ex = 'this should be protected';

{
 "translation":["Hello world"],
 "query":"你好世界",
 "errorCode":0,
 "web":[
  {
   "value":["hello world"],
   "key":"你好世界"
  },
  {
   "value":["Hello World"],
   "key":"世界你好"
  }
 ]
}

Report a bug 参数

    public function getErrorCode() {

用json_decode函数返回array的方式得到:

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

      return self::ERROR_CODE;

Array
(
 [translation] => Array
  (
   [0] => Hello world
  )
 [query] => 你好世界
 [errorCode] => 0
 [web] => Array
  (
   [0] => Array
    (
     [value] => Array
      (
       [0] => hello world
      )
     [key] => 你好世界
    )
   [1] => Array
    (
     [value] => Array
      (
       [0] => Hello World
      )
     [key] => 世界你好
    )
  )
)

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

    }

我们在PHP语言中可以用以下方法取得我们想要的值:

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.

  }

 代码如下

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

现在,对这个类的实例进行json转换:

<?php
/*----------------------------------
$data = '
{
 "translation":["Hello world"],
 "query":"你好世界",
 "errorCode":0,
 "web":[
  {
   "value":["hello world"],
   "key":"你好世界"
  },
  {
   "value":["Hello World"],
   "key":"世界你好"
  }
 ]
}
';
-------------------------------------*/
$data = <<<STR
{
 "translation":["Hello world"],
 "query":"你好世界",
 "errorCode":0,
 "web":[
  {
   "value":["hello world"],
   "key":"你好世界"
  },
  {
   "value":["Hello World"],
   "key":"世界你好"
  }
 ]
}
STR;
$jsondata=json_decode($data,true);
header("Content-Type: text/html; charset=UTF-8");
//print_r($jsondata);
echo "<br />".$jsondata['translation'][0]; //Hello world
echo "<br />".$jsondata['query']; //你好世界
echo "<br />".$jsondata['web'][0]['value'][0]; //hello world
echo "<br />".$jsondata['web'][1]['key']; //世界你好
?>

Report a bug 更新日志
版本 说明
5.4.0 options 参数增加常量: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, 和 JSON_UNESCAPED_UNICODE。
5.3.3 options 参数增加常量:JSON_NUMERIC_CHECK。
5.3.0 增加 options 参数.

复制代码 代码如下:

例,结合数据库操作

Report a bug 范例

$foo = new Foo;
$foo_json = json_encode($foo);
echo $foo_json;

 代码如下

Example #1 A json_encode() 的例子

输出结果是:
{"public_ex":"this is public"}

<?php
include './include/conn.php';  //数据库链接文件
$sql_notice = mysql_query('SELECT * FROM gg_notice where enable = "1" limit 0,10');
$notice = mysql_fetch_array($sql_notice, MYSQL_ASSOC);
print_r ($notice);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ";
<html xmlns=";
<head>
<title>第一php网提供的教程--将数据库读取的数据生成json格式</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- <script src="" type="text/javascript"/></script> -->
<script language=javascript>
</script>
</head>
<body>
<pre>
<h1>请注意两种方法生成的对象数组在结构上的区别</h1>
<?php
echo '<h1>法一</h1>';
//假设以下数组是根据我们从数据库读取的数据生成的
$jarr=array('total'=>239,'row'=>array(
           array('code'=>'001','name'=>'中国www.111cn.net','addr'=>'Address 11','col4'=>'col4 data'),
           array('code'=>'002','name'=>'Name 2','addr'=>'Address 12','col4'=>'col4 data'),
                                     )
           );
//法一:
$jobj=new stdclass();//实例化stdclass,这是php内置的空类,可以用来传递数据,由于json_decode后的数据是以对象数组的形式存放的,
//所以我们生成的时候也要把数据存储在对象中
foreach($jarr as $key=>$value){
$jobj->$key=$value;
}
print_r($jobj);//打印传递属性后的对象
echo '使用$jobj->row[0]['code']输出数组元素:'.$jobj->row[0]['code'].'<br>';
echo '编码后的json字符串:'.json_encode($jobj).'<br>';//打印编码后的json字符串

 代码如下

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。

echo '<hr>';
//法二:
echo '<h1>法二</h1>';
echo '编码后的json字符串:';
echo $str=json_encode($jarr);//将数组进行json编码
echo '<br>';
$arr=json_decode($str);//再进行json解码
print_r($arr);//打印解码后的数组,数据存储在对象数组中
echo '使用$arr->row[0]->code输出数组元素:'.$arr->row[0]->code;

<?php
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

4、json_decode() 该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:

?>

echo json_encode($arr);
?>

复制代码 代码如下:

</body>
</html>

以上例程会输出:

$json = '{"foo": 12345}';
$obj = json_decode($json);
print $obj->{'foo'}; // 12345

{"a":1,"b":2,"c":3,"d":4,"e":5}

通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));

Example #2 json_encode() 函数中 options 参数的用法

结果就是生成一个PHP对象:

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

复制代码 代码如下:

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), "nn";

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)

$b = array();

}

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

如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json),true);

$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), "nn";

复制代码 代码如下:

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

array(5) {
     ["a"] => int(1)
     ["b"] => int(2)
     ["c"] => int(3)
     ["d"] => int(4)
     ["e"] => int(5)
}

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

5、json_decode()的常见错误 下面三种json写法都是错的,你能看出错在哪里吗?

以上例程会输出:

复制代码 代码如下:

Normal: ["<foo>","'bar'",""baz"","&blong&","u00e9"]
Tags: ["u003Cfoou003E","'bar'",""baz"","&blong&","u00e9"]
Apos: ["<foo>","u0027baru0027",""baz"","&blong&","u00e9"]
Quot: ["<foo>","'bar'","u0022bazu0022","&blong&","u00e9"]
Amp: ["<foo>","'bar'",""baz"","u0026blongu0026","u00e9"]
Unicode: ["<foo>","'bar'",""baz"","&blong&","é"]
All: ["u003Cfoou003E","u0027baru0027","u0022bazu0022","u0026blongu0026","é"]

$bad_json = "{ 'bar': 'baz' }";
$bad_json = '{ bar: "baz" }';
$bad_json = '{ "bar": "baz", }';

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

对这三个字符串执行json_decode()都将返回null,并且报错。

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

第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。

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

另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。
var_dump(json_decode("Hello World")); //null

Example #3 连续与非连续数组示例

您可能感兴趣的文章:

  • php中json_decode()和json_encode()的使用方法
  • php获取post中的json数据的实现方法
  • PHP JSON 数据解析代码
  • php返回json数据函数实例
  • 使用PHP接收POST数据,解析json数据
  • 浅析php中json_encode()和json_decode()
  • php处理json时中文问题的解决方法
  • php中JSON的使用与转换
  • PHP JSON格式数据交互实例代码详解
  • php判断是否为json格式的方法
  • php中json_encode UTF-8中文乱码的更好解决方法
  • ajax处理php返回json数据的实例代码
  • php操作JSON格式数据的实现代码
  • php处理json格式数据经典案例总结

 代码如下

<?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"}"

$obj->Name= 'a1';$obj->Number ='123';
$obj->Contno= '000';
echo json_encode($obj);

结果为:

{"Name":"a1",
"Number":"123",
"Contno":"000"
}

可以看出json_encode()和json_decode()是编译和反编译过程,注意json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null

如果是中文的话就要注意了

在网上找到一种解决方法:

 代码如下

<?php
/* 处理json_encode中文乱码 */
$data = array ('game' => '冰火国度', 'name' => '刺之灵', 'country' => '冰霜国', 'level' => 45 );
echo json_encode ( $data );
echo "<br>";
$newData = array ();
foreach ( $data as $key => $value ) {
$newData [$key] = urlencode ( $value );
}
echo urldecode ( json_encode ( $newData ) );
?>

后来请教了别人,还可以用base64编码,不过base64编码不可以放在URL中,百度是这样解释的:

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

不过我的数据是要通过POST发送的,并不在HTTP 的head中,而在message-body里,所以不受影响。

json_encode 只能接受utf-8格式的数据

例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的。
  我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文!
测试代码如下:

 代码如下

<?php
class myClass {
public $item1 = 1;
public $item2 = '中文';
function to_json() {
//url编码,避免json_encode将中文转为unicode
$this->item2 = urlencode($this->item2);
$str_json = json_encode($this);
//url解码,转完json后将各属性返回,确保对象属性不变
$this->item2 = urldecode($this->item2);
return urldecode($str_json);
}
}
$c = new myClass();
echo json_encode($c);
echo '<br/>';
echo $c->to_json();
echo '<br/>';
echo json_encode($c);
echo '<br/>';
echo json_encode('胥');
?>

程序输出结果:

{"item1":1,"item2":"u4e2du6587"}
{"item1":1,"item2":"中文"}
{"item1":1,"item2":"u4e2du6587"}
"u80e5"

 

本文由永利集团登录网址发布于永利集团登录网址,转载请注明出处:PHP使用JSON实例分析详解

关键词: