除了解码JSON之外,还有使用json_decode的特殊用途吗?

问题描述

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是从此表加载的用户配置文件字段的键/值对数组

enter image description here

您可以看到这些值主要是普通的字符串或数字。

由于用户不太可能在此处输入JSON字符串,那么为什么在此处使用json_decode

在这里有什么特殊目的吗?

解决方法

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

有一些边缘情况,例如:

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

这里是非详尽的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
---

因此,在某些情况下,encoding-storing-decoding会在可能遭受“打ic”的环境中创建稳定性。在其他情况下,当环境不允许存储布尔类型值时,将字符串值呈现为布尔值可能是一种变通方法。

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

p.s。条件:

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

只是Joomla尝试在预期结果失败时进行一些清理,因为该值在进入存储之前没有经过json_encoded的适当处理(...容纳不良的开发/数据或Joomla的先前版本而不是json_encoding )。

,

此处使用JSON来允许存储不同的数据类型(包括数组和对象),并将它们还原为代码中的正确类型,同时保持用于处理数据的代码最少。即没有针对特定字段的特殊处理,所有操作都在一个简单的循环中完成。