Я использую среду разработки 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
?
Извините, если мое объяснение трудно понять; мне было трудно объяснить. Пожалуйста, попросите у меня любые разъяснения, которые вам нужны.