json_encode()函数第二个参数的使用方法

  使用json_encode()函数时如果没有设置第二个参数PHP会默认将斜杠进行转义,还会将中文进行unicode编码。
 
  要解决斜杠转义问题第二个参数可以传递PHP常量JSON_UNESCAPED_SLASHES,要解决中文unicode编码问题第二个参数可以传递PHP常量JSON_UNESCAPED_UNICODE,但是如果要同时解决斜杠转义和中文unicode编码就要用另一种方式了。
 
  实际上常量JSON_UNESCAPED_SLASHES和JSON_UNESCAPED_UNICODE都是一个整数,而且相关常量还不止这两个,具体可看下面的列表:
 
  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_ERROR_DEPTH          => 1
  JSON_ERROR_STATE_MISMATCH => 2
  JSON_ERROR_CTRL_CHAR      => 3
  JSON_ERROR_SYNTAX         => 4
  JSON_ERROR_UTF8           => 5
  JSON_OBJECT_AS_ARRAY      => 1
  JSON_BIGINT_AS_STRING     => 2
 
  要同时使用多个常量只要将其代表的数值加起来即可,如我们要同时解决斜杠转义和中文unicode编码的问题就需要同时使用JSON_UNESCAPED_SLASHES和JSON_UNESCAPED_UNICODE,而两者数值加起来是320=64+256,即:

  json_encode($arr, 320)

  但建议使用如下写法:

  json_encode($arr, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)



  JSON相关方法封装

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
ini_set('error_reporting', E_ALL);

function v(mixed $value, mixed ...$values): void
{
    ob_start();
    var_dump($value);
    echo ob_get_clean();

    foreach ($values as $v) {
        v($v);
    }
}

/**
 * Json类
 */
class Json
{
    /**
     * 对变量进行JSON编码
     *
     * @param mixed $value 待编码的value,除了resource类型之外,可以为任何数据类型
     * @return string|false 成功则返回JSON编码的string或者在失败时返回false
     */
    public static function encode(mixed $value): string|false
    {
        try {
            $encode = json_encode($value, JSON_THROW_ON_ERROR | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        } catch (JsonException) {
            $encode = false;
        }

        return $encode;
    }

    /**
     * 对JSON格式的字符串进行解码
     *
     * @param string $json 待解码的json string格式的字符串
     * @return mixed 返回编码的数据,若解码失败将会返回null
     */
    public static function decode(string $json): mixed
    {
        try {
            $decode = json_decode($json, true, 512, JSON_THROW_ON_ERROR | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        } catch (JsonException) {
            $decode = null;
        }

        return $decode;
    }
}

$profile = ['name' => '张三', 'sex' => '男', 'birth' => 2003];

$encode = Json::encode($profile);
v($encode); // string(42) "{"name":"张三","sex":"男","birth":2003}"

$decode = Json::decode($encode);
v($decode); // array(3) { ["name"]=> string(6) "张三" ["sex"]=> string(3) "男" ["birth"]=> int(2003) }

Copyright © 2024 码农人生. All Rights Reserved