在这里,我的班级名称是User,当我打印班级属性时,我会正确获得目标名称。之后,我使用json_encode()对数据进行了编码。然后我用json_decode()解码。为什么我要 stdClass 目标?
<?php
class User
{
public $name;
public $age;
public $salary;
}
$user = new User();
$user->name = 'Siddhu';
$user->age = 24;
$user->salary = 7000.80;
print_r($user);
//Output: User Object ( [name] => Siddhu [age] => 24 [salary] => 7000.8 )
print_r(json_encode($user));
//Output: {"name":"Siddhu","age":24,"salary":7000.8}
$d = json_encode($user);
$s = json_decode($d);
print_r($s);
//Output: stdClass Object ( [name] => Siddhu [age] => 24 [salary] => 7000.8 )
如果您注意到 stdClass 即将到来,如何更改为用户
答案 0 :(得分:4)
没有直接的方法可以在类对象中获取数据,或者需要使用自定义方法进行解码,否则在解码时可以使用serialize()&& unserialize()函数在类对象中获取数据;
$serialized_user_object = serialize($user);
$deserialized_user_object = unserialize($serialized_user_object);
在json_decode中,如果要将数据作为数组,则可以在第二个参数中传递true。 这样。
var_dump(json_decode($json, true));
要了解有关json_decode的更多信息,请参见here。
答案 1 :(得分:3)
发生这种情况的原因可以很容易地证明...
class foo{
public $bar = 'bar';
}
$json = json_encode(new foo);
echo $json."\n\n";
print_r(json_decode($json));
输出
{"bar":"bar"}
stdClass Object
(
[bar] => bar
)
您可以看到输出{"bar":"bar"}
不包含有关任何类的信息,它可能是['bar'=>'bar']
,并且JSON相同...然后解码时,您不必将json_decode
设置为以数组形式返回(第二个参数设置为true),这很好,因为这并不是您真正想要的,但是以这种方式设置时,您将获得stdClass对象,而不是用于该对象的关联数组非数字键的项目。简而言之,由于信息不存在(您可以使其存在,但这又是另一回事了),因此无法从json {"bar":"bar"}
中恢复类“ foo”。
使用序列化,我们得到了非常不同的东西。
class foo{
public $bar = 'bar';
}
$json = serialize(new foo);
echo $json."\n\n";
print_r(unserialize($json));
输出
O:3:"foo":1:{s:3:"bar";s:3:"bar";}
foo Object
(
[bar] => bar
)
此O:3:foo
表示对象,其类名为3的长度为3。因此,它可以保留该信息供PHP在“解码”数据时使用。
整个内容如下:
对象(3)“ foo”具有1个名为(s)tring(3)“ bar”的属性,其值为(s)tring(3)“ bar”或类似的东西。
有道理。
请注意,PHP的序列化比JSON移植性差,因为它只能在PHP中使用,因此手动编辑然后比JSON难得多,但是如果您真的想编码一个类,那是最简单的方法。也就是说,您还可以从JSON数据“重新填充”该类,但这也很难维护。