遇到个很幼稚的问题,用json_encode把数组转换为json时,发现转化的值为null。怎么回事呢?查找手册:发现了下面的话:
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)
原来数组中有中文,需要转码哦,写个转换字符编码的函数吧:
PHP代码
- function encodeConvert($str,$fromCode,$toCode)
- {
- if (strtoupper($toCode) == strtoupper($fromCode)) return $str;
- if (is_string($str)) {
- if (function_exists('mb_convert_encoding')) {
- return mb_convert_encoding($str, $toCode, $fromCode);
- } else {
- return iconv($fromCode, $toCode, $str);
- }
- } elseif (is_array($str)) {
- foreach ($str as $k => $v) {
- $str[$k] = encodeConvert($v, $fromCode, $toCode);
- }
- return $str;
- }
- return $str;
- }
对于数组,通过下面方式json_encode调用,一切ok。
PHP代码
- $json_api=json_encode(encodeConvert($json_api,'gb2312','utf-8'));
- $json_api=json_decode(json_decode($json_api));
今天数组json_encode转json的时候,输出一片空白,难道是数据量太大了?导致输出空白了?
后来检查下php程序似乎没有出错,就是json_encode的时候出现了问题,那到底是什么问题呢?
我们先来说下json_encode这个函数
C#代码
- (PHP 5 >= 5.2.0, PECL json >= 1.2.0, PHP 7)
- json_encode — 对变量进行 JSON 编码
- 说明
- -----------------------------------------------------------
- string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )
- 参数
- -----------------------------------------------------------
- value
- 待编码的 value ,除了resource 类型之外,可以为任何数据类型。
- 所有字符串数据的编码必须是 UTF-8。
- 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_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR。
- depth
- 设置最大深度。 必须大于0。
- 返回值
- -----------------------------------------------------------
- 成功则返回 JSON 编码的 string 或者在失败时返回 FALSE 。
注意:上面对参数明确说明(所有字符串数据的编码必须是 UTF-8)
可能正是因为这一点导致我输出错误,但是我怎么知道,会是这个错误呢?因为我发现有一个这个函数json_last_error
我们看下这个函数
C#代码
- (PHP 5 >= 5.3.0, PHP 7)
- json_last_error — 返回最后发生的错误
- 说明
- -----------------------------------------------------------
- int json_last_error ( void )
- 如果有,返回 JSON 编码解码时最后发生的错误。
- 参数
- -----------------------------------------------------------
- 此函数没有参数。
- 返回值
- -----------------------------------------------------------
- 返回一个整型(integer),这个值会是以下的常量之一:
C#代码
- 例如:
- echo json_encode(array('error' => '0', 'message' => '没有错误'));
- var_dump(json_last_error());
- //这里也可以是json_decode
- //错误码对照
- 0 JSON_ERROR_NONE
- 1 JSON_ERROR_DEPTH
- 2 JSON_ERROR_STATE_MISMATCH
- 3 JSON_ERROR_CTRL_CHAR
- 4 JSON_ERROR_SYNTAX
- 5 JSON_ERROR_UTF8
- 6 JSON_ERROR_RECURSION
- 7 JSON_ERROR_INF_OR_NAN
- 8 JSON_ERROR_UNSUPPORTED_TYPE
我返回的是 int 5,对照返回错误码,自然而然就是(异常的 UTF-8 字符,也许是因为不正确的编码)这个错误了,知道错误后,然后检查你要返回的数据,再做下处理就OK了。