json_encode

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SchopenhauerZhang/article/details/84189258

最近使用json_encode遇到了写问题,原本打算和同事一起探讨一下,但是结果很不理想,所以自己总结一下,写了这篇文章。

json_encode()函数算是常用的json编码。
但是平时用的不够细致,这里做下简单的介绍已经总结。
先贴下测试代码,有些人喜欢看代码:

<?php

$a = "&'zhang张zhang张张a's'da'da'd张张爱仕达大多$@!?////\\\\1231\n313$#@!##$";



echo "son_encode参数是JSON_UNESCAPED_UNICODE\n";
var_dump(json_encode($a,64));
//string(113) ""&'zhang\u5f20zhang\u5f20\u5f20a's'da'da'd\u5f20\u5f20\u7231\u4ed5\u8fbe\u5927\u591a$@!?////\\\\1231\n313$#@!##$""


var_dump(json_encode($a,70));
//string(143) ""\u0026\u0027zhang\u5f20zhang\u5f20\u5f20a\u0027s\u0027da\u0027da\u0027d\u5f20\u5f20\u7231\u4ed5\u8fbe\u5927\u591a$@!?////\\\\1231\n313$#@!##$""


echo "son_encode参数是JSON_UNESCAPED_SLASHES \n";
var_dump(json_encode($a,256));
// string(87) ""&'zhang张zhang张张a's'da'da'd张张爱仕达大多$@!?\/\/\/\/\\\\1231\n313$#@!##$""


echo "json_encode参数是JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES \n<br />";
var_dump(json_encode($a,64 | 256));
//string(83) ""&'zhang张zhang张张a's'da'da'd张张爱仕达大多$@!?////\\\\1231\n313$#@!##$""
var_dump(json_encode($a,330));

//string(88) ""\u0026'zhang张zhang张张a's'da'da'd张张爱仕达大多$@!?////\\\\1231\n313$#@!##$""

echo "json_encode参数是 320\n";
var_dump(json_encode($a,320));
//string(83) ""&'zhang张zhang张张a's'da'da'd张张爱仕达大多$@!?////\\\\1231\n313$#@!##$""

var_dump(json_encode(json_encode($a,64),256));
//string(136) ""\"&'zhang\\u5f20zhang\\u5f20\\u5f20a's'da'da'd\\u5f20\\u5f20\\u7231\\u4ed5\\u8fbe\\u5927\\u591a$@!?\/\/\/\/\\\\\\\\1231\\n313$#@!##$\"""

var_dump(json_encode(json_encode($a,256),64));
//string(130) ""\"&'zhang\u5f20zhang\u5f20\u5f20a's'da'da'd\u5f20\u5f20\u7231\u4ed5\u8fbe\u5927\u591a$@!?\\/\\/\\/\\/\\\\\\\\1231\\n313$#@!##$\"""

echo "原生json_encode\n";
var_dump(json_encode($a));
//string(117) ""&'zhang\u5f20zhang\u5f20\u5f20a's'da'da'd\u5f20\u5f20\u7231\u4ed5\u8fbe\u5927\u591a$@!?\/\/\/\/\\\\1231\n313$#@!##$""

echo "json_encode > 256\n ";
var_dump(json_encode($a,100000));
// string(117) ""&'zhang\u5f20zhang\u5f20\u5f20a's'da'da'd\u5f20\u5f20\u7231\u4ed5\u8fbe\u5927\u591a$@!?\/\/\/\/\\\\1231\n313$#@!##$""
var_dump(json_encode($a,100001));
//string(117) ""&'zhang\u5f20zhang\u5f20\u5f20a's'da'da'd\u5f20\u5f20\u7231\u4ed5\u8fbe\u5927\u591a$@!?\/\/\/\/\\\\1231\n313$#@!##$""
?>

**

基础的json_encode函数

**
从上面的例子可以看到,json_encode()的第二个参数是编码方式:
参数列表(http://php.net/manual/zh/json.constants.php)
简单列一下:
JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256

可以看到在例子中,我传参用的都是数字,在json_encode函数内部处理参数时使用的是2进制,既是json_encode(,4);处理时是json_encode(,100),这里100是2进制;
所以再回头看例子,json_encode( a , 64 256 ) j s o n e n c o d e ( a,64 | 256)等同于json_encode( a,320),这里不是简单的320 = 256+64,而是256化为2进制和64的二进制数进行按位或,结果是10进制的320(注意最后结果和256+64结果吻合,但是计算方法不一样).

然后接着看下一个例子,var_dump(json_encode(json_encode( a , 64 ) , 256 ) ) ; v a r d u m p ( j s o n e n c o d e ( j s o n e n c o d e ( a,64),256));和var_dump(json_encode(json_encode( a,256),64));明显能看到编码后的结果不一致,这里结果编码顺序导致的,不管是先按照256还是64的方式编码,其结果对于下一次编码都是会产生影响的,所以顺序的改变导致编码结果完全不一致。这也说明编码方式不是互补的关系而已协同的关系,因为如果是互补那么就和编码顺序无关。下面会深入的讲解。

深入json_encode()函数一点

为何我前面说第二个参数不是互补是协同呢?
看例子:
var_dump(json_encode( a , 320 ) ) ; v a r d u m p ( j s o n e n c o d e ( a,320));和var_dump(json_encode( a,330));
330比320多了10(2+8),2和8是二进制10和100,参考2和8对应的编码方式:
JSON_HEX_AMP (integer) =》2
所有的 & 转换成 \u0026。
JSON_HEX_QUOT (integer)=》8
所有的 " 转换成 \u0022。 自 PHP 5.3.0 起生效。

var_dump(json_encode($a,330));
//string(88) ""\u0026'zhang张zhang张张a's'da'da'd张张爱仕达大多$@!?////\\\\1231\n313$#@!##$""


var_dump(json_encode($a,320));
//string(83) ""&'zhang张zhang张张a's'da'da'd张张爱仕达大多$@!?////\\\\1231\n313$#@!##$""

发现了吗,330相比于320多了对&和‘2个字符的编码,而对&和’2个字符编码的参数刚好是2和8.
所以得到以下推论:
json_encode(, n u m b e r ) , number), number取值为10,那么其对应的编码方式是2|8,也就是通知对& '2个字符进行编码,同理推导,number为66,是编码方式是64|2,对空白字符和&进行编码。
所以如果给第二个参数为一个任意数字,函数内部会对这个数字进行拆解为已支持编码方式的|运算(可以理解为加,但是不是加运算)。

所以通过上述介绍,总结一下:
1 json_encode()第二个参数代表编码方式;
2 第二个参数可以传参数字但是函数内部处理时使用的是其对应的二进制数;
3 第二个参数的传参是随意的,函数内部拿到这个参数会在已有的编码方式上进行|运算,从而得到符合参数的编码方式。
目前已支持的编码方式有:
1,2,4,8,16,32,64,128,256
换言之要么是上面编码的一种,要么是上面编码的组合。
这无疑对我们理解json__encode函数有了很大的帮助。

猜你喜欢

转载自blog.csdn.net/SchopenhauerZhang/article/details/84189258