Php 它';有没有可能自定义json_编码的方式,对我的对象进行编码?

Php 它';有没有可能自定义json_编码的方式,对我的对象进行编码?,php,json,Php,Json,我有一个类,它通过内置的JSON_encode序列化为JSON。然而,当这个对象被编码时,我希望它的某些属性被不同的编码。例如,在下面的代码中,我希望使用小写名称对属性进行编码(即Value变为Value) 阅读(并在类中实现)接口 class MyClassName implements JsonSerializable { public $Value; public $OtherValue; public function jsonSerialize() {

我有一个类,它通过内置的JSON_encode序列化为JSON。然而,当这个对象被编码时,我希望它的某些属性被不同的编码。例如,在下面的代码中,我希望使用小写名称对属性进行编码(即Value变为Value)

阅读(并在类中实现)接口

class MyClassName implements JsonSerializable
{
    public $Value;
    public $OtherValue;

    public function jsonSerialize()
    {
        return array(
            'value' => $this->Value,
            'otherValue' => $this->OtherValue,
        );
    }
}
如果类实现了接口,
json\u encode()
在需要对类的实例进行编码时调用方法
jsonSerialize()

该方法必须返回一个数组,该数组由
json\u encode()
编码,而不是由生成它的实例编码

您可以从
jsonSerialize()
方法返回任何需要的内容。您可以省略属性,“发明”类中不存在的属性、计算值等

请注意,
json\u decode()
不使用反向方法。因为PHP对象的类不是用JSON表示法编码的
JSON\u encode()
只能创建
stdClass
对象(或关联数组)。这使得这种解码方法毫无用处

但是,在解码时,很容易将数组或stdClass对象传递给
MyClassName
类的构造函数,或者传递给可以使用解码数据恢复对象状态的初始化方法。

阅读(并在类中实现)接口

class MyClassName implements JsonSerializable
{
    public $Value;
    public $OtherValue;

    public function jsonSerialize()
    {
        return array(
            'value' => $this->Value,
            'otherValue' => $this->OtherValue,
        );
    }
}
如果类实现了接口,
json\u encode()
在需要对类的实例进行编码时调用方法
jsonSerialize()

该方法必须返回一个数组,该数组由
json\u encode()
编码,而不是由生成它的实例编码

您可以从
jsonSerialize()
方法返回任何需要的内容。您可以省略属性,“发明”类中不存在的属性、计算值等

请注意,
json\u decode()
不使用反向方法。因为PHP对象的类不是用JSON表示法编码的
JSON\u encode()
只能创建
stdClass
对象(或关联数组)。这使得这种解码方法毫无用处

但是,在解码时,可以很容易地将数组或stdClass对象传递给
MyClassName
类的构造函数,或者传递给可以使用解码数据恢复对象状态的初始化方法。

PHP为此提供了接口:

class MyClassName implements JsonSerializable
{
    public $Value;
    public $OtherValue;

    function jsonSerialize()
    {
        return array_change_key_case((array) $this, CASE_LOWER);
    }
}
PHP为此目的提供了接口:

class MyClassName implements JsonSerializable
{
    public $Value;
    public $OtherValue;

    function jsonSerialize()
    {
        return array_change_key_case((array) $this, CASE_LOWER);
    }
}

另一种方法可能是,当您接收到json use function以在回显are函数(如
strtolower
)之前将对象的第一个字母小写时,可以选择向类中添加一个方法(如
toArray
),该方法以您希望的编码方式返回属性等,你所需要做的就是以你所需要的方式来准备数据,而不是期望奇迹和简单函数的读心术。@N.B.两者的问题都是我不希望我的变量名是小写的。所以我不能简单地将变量小写。你是说你知道你想要的JSON是什么样子的,你可以编辑你的类,你不能用你自己的代码计算出你想要的东西?我是说真的。。这是一个如此简单的问题,我真的不知道你为什么要问这个问题。因为修改类意味着必须更新几十个用例。其中,修改
json\u encode
对我的对象进行编码的方式意味着不修改任何内容。另一种方式可能是,当您收到json时,使用函数将对象的第一个字母小写,然后在其中回显are函数,例如
strtolower
,有一个选项可以向类中添加一个方法,例如
toArray
,该方法以您希望的编码方式返回属性,你所需要做的就是以你所需要的方式来准备数据,而不是期望奇迹和简单函数的读心术。@N.B.两者的问题都是我不希望我的变量名是小写的。所以我不能简单地将变量小写。你是说你知道你想要的JSON是什么样子的,你可以编辑你的类,你不能用你自己的代码计算出你想要的东西?我是说真的。。这是一个如此简单的问题,我真的不知道你为什么要问这个问题。因为修改类意味着必须更新几十个用例。其中,修改
json\u encode
编码我的对象的方式意味着不修改任何对象。如果我使用此方法,生成的json数据是否仍将我的对象表示为对象,或者是否将其转换为数组?如果数组具有以
0
开头的数字正数和连续键,则在json中将其编码为数组。否则(字符串键、间隙,不以
0
开头)将被编码为对象。这是因为JSON是Javascript的子集,Javascript数组只有数字键。数组键不是用JSON编码的(这就是为什么它们必须是数字的、正数的、连续的并且以
0
开头)。为了回答您的具体问题,我在回答中发布的示例代码返回的数组在JSON中编码为数组。如果我使用此方法,生成的JSON数据是否仍将我的对象表示为对象,或者它会被转换成一个数组吗?如果一个数组有以
0
开头的数字正键和连续键,那么它在JSON中被编码为数组。否则(字符串键、间隙,不以
0
开头)将被编码为对象。这是因为