当前位置: 首页> 最新文章列表> json_decode 函数如何解析非标准格式的 JSON 字符串,有哪些实用技巧?

json_decode 函数如何解析非标准格式的 JSON 字符串,有哪些实用技巧?

gitbox 2025-06-22

在 PHP 中,json_decode 函数通常用于解析符合标准格式的 JSON 字符串并将其转换为 PHP 数据类型。标准 JSON 字符串要求键名必须是双引号(" ")包围的,字符串值必须是有效的 Unicode 字符等。然而,在实际开发中,我们可能会遇到非标准格式的 JSON 字符串,如何有效解析这些字符串成为一个挑战。本文将探讨如何使用 json_decode 函数处理非标准格式的 JSON 字符串,并分享一些实用技巧。

1. 处理单引号的 JSON 字符串

标准的 JSON 字符串要求使用双引号(" ")来包裹键名和字符串值,但有时我们会遇到键名或字符串值使用单引号(' ')的情况。PHP 的 json_decode 并不直接支持单引号,但我们可以通过一些简单的替换,将其转换为标准的 JSON 格式。

示例:

<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">"{'name':'John', 'age':30}"</span></span><span>;
</span><span><span class="hljs-variable">$correctedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>([</span><span><span class="hljs-string">"'"</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], [</span><span><span class="hljs-string">'"'</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], </span><span><span class="hljs-variable">$json</span></span><span>);
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$correctedJson</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>

在这个示例中,我们使用 str_replace 函数将所有单引号替换为双引号,这样 json_decode 就可以顺利解析该字符串。

2. 处理不完整的 JSON 字符串

有时我们可能遇到一些不完整的 JSON 字符串,例如缺少闭合的括号或逗号。这类情况会导致 json_decode 返回 null。为了处理这种情况,我们可以先使用正则表达式或简单的字符串操作来补全这些不完整的部分。

示例:

<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30'</span></span><span>;  </span><span><span class="hljs-comment">// 缺少闭合大括号</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rtrim</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-string">','</span></span><span>) . </span><span><span class="hljs-string">'}'</span></span><span>;  </span><span><span class="hljs-comment">// 修复 JSON 字符串</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$fixedJson</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>

通过这种方法,我们可以避免手动检查每个 JSON 字符串,并确保解析的准确性。

3. 处理 JSON 字符串中的多余的逗号

在某些非标准 JSON 字符串中,数组或对象中的元素后可能会多一个逗号(,)。这种情况虽然在标准 JSON 中是非法的,但我们可以通过简单的字符串替换来删除多余的逗号,保证 json_decode 可以正确解析。

示例:

<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30,}'</span></span><span>;  </span><span><span class="hljs-comment">// 多了一个逗号</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/,\s*([}\]])/'</span></span><span>, </span><span><span class="hljs-string">'$1'</span></span><span>, </span><span><span class="hljs-variable">$json</span></span><span>);  </span><span><span class="hljs-comment">// 去除尾部多余的逗号</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$fixedJson</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>

在这里,preg_replace 函数用于查找和删除结尾处的多余逗号,使其符合 JSON 格式。

4. 处理特殊字符编码问题

如果 JSON 字符串中包含特殊字符,例如中文字符或者非 ASCII 字符,json_decode 函数可能会因为字符编码问题而解析失败。确保 JSON 字符串采用 UTF-8 编码,并在解析时使用正确的字符集,可以避免此类问题。

示例:

<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"中文", "age":30}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>, </span><span><span class="hljs-number">512</span></span><span>, JSON_UNESCAPED_UNICODE);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>

在这个例子中,JSON_UNESCAPED_UNICODE 选项让 json_decode 解析过程中不对 Unicode 字符进行转义,保持原始字符编码。

5. 忽略未知的键

有时我们会遇到一些不符合预期结构的 JSON 字符串,这些字符串可能包含多余的键或者某些不需要的字段。通过传递第二个参数 true,可以将 JSON 字符串解析为关联数组,这样可以轻松地跳过不需要的字段,保留有用的数据。

示例:

<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30, "extraField":"value"}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);  </span><span><span class="hljs-comment">// 解析为关联数组</span></span><span>
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'extraField'</span></span><span>]);  </span><span><span class="hljs-comment">// 删除不需要的字段</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>

这段代码演示了如何忽略 JSON 字符串中的某些字段,并只保留需要的数据。

6. 设置 json_decode 的错误处理机制

如果解析过程中发生错误,json_decode 将返回 null。为了提高代码的健壮性,通常我们需要在解析之前或之后检查是否发生了错误。PHP 提供了 json_last_error()json_last_error_msg() 函数来获取 JSON 解析的错误信息。

示例:

<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">json_last_error</span></span><span>() !== JSON_ERROR_NONE) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"JSON 解码错误: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">json_last_error_msg</span></span><span>();
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
}
</span></span>

通过这种方式,我们可以准确捕获 JSON 解析中的错误并进行相应处理。

结语

在处理非标准格式的 JSON 字符串时,json_decode 函数本身提供了很强的灵活性,通过一些字符串处理技巧,通常可以解决大部分问题。关键在于准确识别问题所在,并采取合适的处理方式。通过本文分享的几种技巧,您可以更加高效地处理 JSON 数据,提高代码的健壮性和稳定性。