0

我正在使用 PHP 5.6.40 开发环境。我的许多课程都实现了JsonSerializable. jsonSerialize这些类之一的方法使用,json_decode因为其数据成员之一的值可能编码为 JSON,也可能不编码为 JSON。问题是在调用json_decode一个值只是一个普通字符串的数据成员之后,json_encode失败了。

这是一个例子:

class JsonSerializableClass implements JsonSerializable
{
    private $dataMember;

    public function __construct($dataMember)
    {
        $this->dataMember = $dataMember;
    }

    public function jsonSerialize()
    {
        $decodedDataMember = json_decode($this->dataMember, 1);

        if ($decodedDataMember && $decodedDataMember['jsonDataMember'])
        {
            return $decodedDataMember['jsonDataMember'];
        }

        // json_encode(''); This keeps json_encode from failing, but I'm looking for a different solution.

        return $this->dataMember;
    }
}

// This works
$test1 = new JsonSerializableClass(json_encode(array(
        'jsonDataMember' => 'plain string'
)));
var_export(json_encode($test1));

// This fails
$test2 = new JsonSerializableClass('plain string');
var_export(json_encode($test2));

json_encode这可以通过在 json_decode 失败后在 jsonSerialize 方法中添加调用来解决;但是,其他开发人员可能不会立即意识到这样做的结果。当然,我会评论我这样做的理由,但我正在寻找一个更清晰的解决方案。json 函数所依赖的错误状态数据是否被成功清除json_encode?如果是这样,有没有办法清楚地重置错误状态数据,比如clear_json_error_state

如果我的解释难以理解,我很抱歉;我很难解释。请向我询问您需要的任何说明。

4

1 回答 1

0

我将版本降级到 V4.1.5,它可以工作。

“名称”:“推送器/推送器-php-server”,“版本”:“v4.1.5”,

于 2021-02-22T13:01:33.723 回答