Как правильно очистить состояние ошибки json_encode? - PullRequest
0 голосов
/ 25 января 2020

Я использую среду разработки PHP 5.6.40. Многие из моих классов реализуют JsonSerializable. В методе jsonSerialize одного из этих классов используется json_decode, поскольку значение одного из его элементов данных может быть или не быть закодировано как 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 в методе jsonSerialize после неудачного кода json; однако другой разработчик может не сразу понять, чего это достигнет. Конечно, я бы прокомментировал мои аргументы в пользу этого, но я ищу более четкое решение. Существуют ли данные состояния ошибки, на которые опираются функции json, которые удаляются успешным json_encode? Если да, есть ли способ четко сбросить эти данные состояния ошибки, например clear_json_error_state?

Извините, если мое объяснение трудно понять; мне было трудно объяснить. Пожалуйста, попросите у меня любые разъяснения, которые вам нужны.

...