json_decode 除了解码 JSON 有啥特殊用途吗?

Posted

技术标签:

【中文标题】json_decode 除了解码 JSON 有啥特殊用途吗?【英文标题】:Is there any special purpose to use json_decode except for decoding JSON?json_decode 除了解码 JSON 有什么特殊用途吗? 【发布时间】:2020-12-25 09:08:17 【问题描述】:
foreach ($results as $v)

    $k = str_replace('profile.', '', $v[0]);
    $data->profile[$k] = json_decode($v[1], true);

    if ($data->profile[$k] === null)
    
        $data->profile[$k] = $v[1];
    

我遇到了这些代码行,它们位于 Joomla 的“配置文件”插件中,位于 profile.php 文件中。这里的$result 是用户配置文件字段的键值对数组,从这个表中加载

您可以看到这些值大多是普通字符串或数字。

既然用户不太可能在这里输入 JSON 字符串,那为什么在这里使用json_decode

这里有什么我遗漏的特殊目的吗?

【问题讨论】:

“这不太可能”......但并非不可能,你认为?如果这不是不可能的,或者甚至在 UI 或文档中明确鼓励,那么采取预防措施对其进行解码是有意义的。 json_decode 除了解码 json 没有其他用途。 那么json_decode后面几行的目的是什么? 正常设置变量,如果将其解码为json失败(即因为该字段的内容不是有效的json。json_decode如果失败则返回null,因此测试null)。 【参考方案1】:

在预期为标量(不可迭代)的数据上使用json_decode() 可能看起来大多是多余的,因为字符串、整数和浮点数在大多数情况下不会受到影响。

有一些边缘情况,例如:

    Strings containing escaped forward slashes Strings containing multibyte characters Strings containing boolean-expressions as strings that will be used as boolean type Strings containing numeric-interpreted values that will be used as integer/float type ...可能还有更多我没有考虑的情况

这是一个非详尽的Demo:

$tests = [
    'true',
    null,
    '123',
    123,
    json_encode('1/2'),
    json_encode('База данни грешка')
];

foreach ($tests as  $test) 
    echo var_export(json_decode($test, true)) . "\n---\n";

输出:

true                       #now boolean type
---
NULL
---
123                        #now integer type
---
123
---
'1/2'                      #previously had escaped slash in storage
---
'База данни грешка'        #previously mutated as unicode expressions in storage
---

因此,在某些情况下,编码-存储-解码可以在可能会遇到“打嗝”的环境中创造稳定性。在其他情况下,当环境不允许存储布尔类型值时,将字符串值呈现为布尔值可能是一种解决方法。

综上所述,在可自定义的字段中允许 json 类型的数据为 Joomla 及其用户在处理复杂/意外的数据结构/值时提供了更大的实用性。

附言条件:

if ($data->profile[$k] === null)

    $data->profile[$k] = $v[1];

只是当预期结果失败时Joomla试图做一些清理工作的问题,因为该值在进入存储之前没有适当的json_encoded(...适应糟糕的开发/数据或者可能不是json_encoding的Joomla的早期版本)。

【讨论】:

【参考方案2】:

这里使用 JSON 来允许存储不同的数据类型(包括数组和对象)并将它们恢复为代码中的正确类型,同时保持处理数据的代码最少。 IE。对特定字段没有特殊处理,一切都在一个简单的循环中完成。

【讨论】:

以上是关于json_decode 除了解码 JSON 有啥特殊用途吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法与 typedef 成为朋友:有啥特别的原因吗?

Json_decode:详解

Hibernate - @Transactional 不起作用有啥特别的原因吗?

json_decode()相关报错

似乎无法解码的 json 编码字符串

PHP 获取JSON json_decode返回NULL解决办法