我正在使用 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
?
如果我的解释难以理解,我很抱歉;我很难解释。请向我询问您需要的任何说明。