PHP json_encode函數的參數說明


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串。不知道這個字段存在的意義,希望各位大佬給出正解。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM