PHP解析json_decode返回null,处理BOM \ufefff

本文探讨了在使用PHP的json_decode函数时遇到的问题,即返回值为null的原因及解决办法。问题源于json字符串开头的ufeff字符,这通常是因为项目中存在带BOM格式的UTF-8文件。文章提供了两种解决方案:一是通过过滤参数中的BOM,二是将带BOM格式的文件转换为无BOM格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题现象

用json_decode()对JSON字符串进行编码转换成PHP变量时发现返回值为null,而且无明显的参数错误。

问题原因

百思不得其解,最后调试发现被转换的json字符串开头莫名其妙的带上了"\ufeff",查询后得知这是由于PHP项目文件中存在带BOM格式文件,导致使用json_encode()编码的json字符串开头会带有"\ufeff",也就是传入了带BOM格式的UTF-8数据,在PHP5.2以后,json_encode()只能接受UTF-8无BOM编码格式的数据。json_decode()解析非UTF-8无BOM格式的数据就会返回null。

解决方法

  1. 方法一(堵漏法)
    既然在json_encode()中传入了带BOM格式的UTF-8数据,导致了问题,那么我们可以在传入参数前,对参数进行一下过滤,也就是移除参数中的BOM,PHP代码如下:
    $result = trim($result, "\xEF\xBB\xBF");
  2. 方法二(治本法)
    导致问题的根本原因是项目中存在带BOM格式的UTF-8文件,那么要从根本上解决问题就必须将带BOM格式文件转换成无BOM格式文件,在linux下可以通过下面两条命令查找带BOM格式文件和将文件转换成无BOM格式:
# 在项目根目录,查找项目中带BOM格式文件并显示
     grep -r -I -l $'^\xEF\xBB\xBF' ./
# 在存在BOM格式文件的目录,将目录下所有文件去除BOM头
# (注意:不能对图片进行此操作,否则会导致图片打不开)
     find . -type f -exec sed -i 's/\xEF\xBB\xBF//' {} \;

 

[OHOS ERROR] Traceback (most recent call last): [OHOS ERROR] File "/home/openharmony/build/hb/containers/status.py", line 47, in wrapper [OHOS ERROR] return func(*args, **kwargs) [OHOS ERROR] ^^^^^^^^^^^^^^^^^^^^^ [OHOS ERROR] File "/home/openharmony/build/hb/util/product_util.py", line 306, in get_product_info [OHOS ERROR] for product_info in ProductUtil.get_products(): [OHOS ERROR] File "/home/openharmony/build/hb/util/product_util.py", line 100, in get_products [OHOS ERROR] info = IoUtil.read_json_file(config_path) [OHOS ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [OHOS ERROR] File "/home/openharmony/build/hb/util/io_util.py", line 37, in read_json_file [OHOS ERROR] data = json.load(input_f) [OHOS ERROR] ^^^^^^^^^^^^^^^^^^ [OHOS ERROR] File "/home/openharmony/prebuilts/python/linux-x86/3.11.4/lib/python3.11/json/__init__.py", line 293, in load [OHOS ERROR] return loads(fp.read(), [OHOS ERROR] ^^^^^^^^^^^^^^^^ [OHOS ERROR] File "/home/openharmony/prebuilts/python/linux-x86/3.11.4/lib/python3.11/json/__init__.py", line 346, in loads [OHOS ERROR] return _default_decoder.decode(s) [OHOS ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^ [OHOS ERROR] File "/home/openharmony/prebuilts/python/linux-x86/3.11.4/lib/python3.11/json/decoder.py", line 337, in decode [OHOS ERROR] obj, end = self.raw_decode(s, idx=_w(s, 0).end()) [OHOS ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [OHOS ERROR] File "/home/openharmony/prebuilts/python/linux-x86/3.11.4/lib/python3.11/json/decoder.py", line 355, in raw_decode [OHOS ERROR] raise JSONDecodeError("Expecting value", s, err.value) from None [OHOS ERROR] json.decoder.JSONDecodeError: Expecting value: line 25 column 1 (char 608) [OHOS ERROR] [OHOS ERROR] Code: 0000 [OHOS ERROR] [OHOS ERROR] Reason: Expecting value: line 25 column 1 (char 608) [OHOS ERROR] [OHOS ERROR] Error Type: UNKNOWN ERROR TYPE [OHOS ERROR] [OHOS ERROR] Description: NO DESCRIPTION [OHOS ERROR] [OHOS ERROR] Solution: NO SOLUTION [OHOS ERROR] =====build error=====
最新发布
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值