PHP json_encode函數的參數說明
一、總結
一句話總結:
· json_encode常常被用於將數組轉換成json格式的字符串來表示,但是json_encode的第一個參數卻並不一定是數組格式,第一個參數可以為對象,數組,字符串。
· object和array類型轉換為json字符串之后沒有差別,而string被json_encode之后,string中的【'】,【"】,【\】,【/】會被轉義。
1、json_encode第二個參數稍微常見例子?
JSON_UNESCAPED_UNICODE (integer) 以字面編碼多字節 Unicode 字符(默認是編碼成 \uXXXX)。 自 PHP 5.4.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_FORCE_OBJECT (integer) 使一個非關聯數組輸出一個類(Object)而非數組。 在數組為空而接受者需要一個類(Object)的時候尤其有用。 自 PHP 5.3.0 起生效。
JSON_NUMERIC_CHECK (integer) 將所有數字字符串編碼成數字(numbers)。 自 PHP 5.3.3 起生效。
JSON_BIGINT_AS_STRING (integer) 將大數字編碼成原始字符原來的值。 自 PHP 5.4.0 起生效。
JSON_PRETTY_PRINT (integer) 用空白字符格式化返回的數據。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_SLASHES (integer) 不要編碼 /。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_UNICODE (integer) 以字面編碼多字節 Unicode 字符(默認是編碼成 \uXXXX)。 自 PHP 5.4.0 起生效。
二、PHP json_encode函數的參數說明
轉自或參考:PHP json_encode函數的參數說明
https://blog.csdn.net/it_r00t/article/details/83993809
今天主要看了一下json_encode函數的參數以及使用,以下主要是對json_encode第2/3個參數的一些自己認為的解析。
首先看一下php.net中關於json_encode的說明:
Description
string json_encode ( mixed $value
[, int $options
= 0 [, int $depth
= 512 ]] )
Returns a string containing the JSON representation of the supplied value // 返回json格式的字符串
The encoding is affected by the supplied options
and additionally the encoding of float values depends on the value of serialize_precision. // 所返回json格式的字符串取決於第二個參數
一: json_encode常常被用於將數組轉換成json格式的字符串來表示,但是json_encode的第一個參數卻並不一定是數組格式,第一個參數可以為對象,數組,字符串。
$array = [
'a' => 'he',
'b' => 'llo',
'c' => 'world',
'd' => [
1 => 'a',
2 => 'b',
3 => 'c'
]
];
// 參數為普通數組 string(62) "{"a":"he","b":"llo","c":"world","d":{"1":"a","2":"b","3":"c"}}"
var_dump(json_encode($array));
// 將數組先轉為json格式字符串,再使用json_decode轉為對象,之后詳細研究json_decode的參數,使用等
$obj = json_decode(json_encode($array));
// 參數為對象 string(62) "{"a":"he","b":"llo","c":"world","d":{"1":"a","2":"b","3":"c"}}"
var_dump(json_encode($obj));
// 參數為字符串
// string(90) ""{\"a\":\"he\",\"b\":\"llo\",\"c\":\"world\",\"d\":{\"1\":\"a\",\"2\":\"b\",\"3\":\"c\"}}""
var_dump(json_encode(json_encode($obj)));
var_dump(json_encode('h"e\l/l[o')); // string(14) ""h\"e\\l\/l[o""
var_dump('h"e\l/l[o'); //string(9) "h"e\l/l[o"
可以發現object和array類型轉換為json字符串之后沒有差別,而string被json_encode之后,string中的【'】,【"】,【\】,【/】會被轉義。
二:接下來看一下第二個參數:
options參考選自原文:https://blog.csdn.net/qd824692746/article/details/50912723
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_FORCE_OBJECT (integer) 使一個非關聯數組輸出一個類(Object)而非數組。 在數組為空而接受者需要一個類(Object)的時候尤其有用。 自 PHP 5.3.0 起生效。
JSON_NUMERIC_CHECK (integer) 將所有數字字符串編碼成數字(numbers)。 自 PHP 5.3.3 起生效。
JSON_BIGINT_AS_STRING (integer) 將大數字編碼成原始字符原來的值。 自 PHP 5.4.0 起生效。
JSON_PRETTY_PRINT (integer) 用空白字符格式化返回的數據。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_SLASHES (integer) 不要編碼 /。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_UNICODE (integer) 以字面編碼多字節 Unicode 字符(默認是編碼成 \uXXXX)。 自 PHP 5.4.0 起生效。
大家可以參考以上羅列出來的常量測試一下。也可以選取自己業務邏輯上的來達到自己的目的。
三:接下來說一下第三個參數,在本人購買的PHP中文手冊中發現json_encode函數中只有以上兩個參數,並沒有第三個參數depth,在查閱PHP官方文檔中是有這個參數的,但是文檔中並沒有詳細的解釋以及示例。猜測大概率是PHP版本的問題,也許購買的中文手冊是基於舊版本的,官方文檔是最新版。在測試中發現第三個參數的不同導致的輸出是有區別的。
// 數組深度為2
$array = [
'a' => '"\/hello',
'b' => '\world',
'c' => '/php_json_decode',
'd' => [
1 => '"\/php',
2 => '//\js',
3 => 'python',
4 => 'golang'
]
];
var_dump(json_encode($array,0,1)); // bool(false)
var_dump(json_encode($array,0,2));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"
var_dump(json_encode($array,0,3));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"
var_dump(json_encode($array,0,4));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"
// 數組深度為3
$array = [
'a' => '"\/hello',
'b' => '\world',
'c' => '/php_json_decode',
'd' => [
1 => '"\/php',
2 => '//\js',
3 => 'python',
4 => 'golang'
],
'e' => [
'xxx' => [
'hello' => 'world'
]
]
];
var_dump(json_encode($array,0,1));
// bool(false)
var_dump(json_encode($array,0,2));
// bool(false)
var_dump(json_encode($array,0,3));
// string(150) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"},"e":{"xxx":{"hello":"world"}}}"
var_dump(json_encode($array,0,4));
// string(150) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"},"e":{"xxx":{"hello":"world"}}}"
發現假如depth的值小於數組的維度的話會輸出bool(false),反之正常解析成json串。不知道這個字段存在的意義,希望各位大佬給出正解。