我有一个对象。我需要转换为JSON进行存储,但是当我尝试将其编码为JSON时,它会返回一个空的JSON对象。当我尝试使用json_last_error
时。
我使用的代码
echo $payload["sub"];
echo json_encode($user);
echo json_last_error_msg();
我得到的结果
"102573480781696194937{}No error".
用户类我尝试编码
<?php
/**
* Created by PhpStorm.
* User: Student
* Date: 13-4-2018
* Time: 10:40
*/
namespace php;
class User
{
private $isAdmin = false;
private $registeredFood = array();
private $googleID;
private $name;
private $notes = array();
private $email;
/**
* User constructor.
* @param $googleID
*/
public function __construct($googleID)
{
$this->googleID = $googleID;
}
/**
* @return mixed
*/
public function getGoogleID()
{
return $this->googleID;
}
/**
* @return bool
*/
public function isAdmin()
{
return $this->isAdmin;
}
/**
* @param bool $isAdmin
*/
public function setIsAdmin($isAdmin)
{
$this->isAdmin = $isAdmin;
}
/**
* @return array
*/
public function getRegisteredFood()
{
return $this->registeredFood;
}
/**
* @param array $registeredFood
*/
public function setRegisteredFood($registeredFood)
{
$this->registeredFood = $registeredFood;
}
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return array
*/
public function getNotes()
{
return $this->notes;
}
/**
* @param array $notes
*/
public function setNotes($notes)
{
$this->notes = $notes;
}
/**
* @return mixed
*/
public function getEmail()
{
return $this->email;
}
/**
* @param mixed $email
*/
public function setEmail($email)
{
$this->email = $email;
}
}
?>
我希望有人可以帮助我
答案 0 :(得分:4)
这是因为您班级的属性是私有的。
仅包含私有属性的示例类...
uint8_t test[25] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0, 0xED};
HAL_SPI_Transmit_DMA(&hspi2, test, sizeof(test));
不公开价值:
php > class Foo { private $bar = 42; }
php > $obj = new Foo();
但是具有公共属性的示例类......
php > echo json_encode($obj);
{}
做到这一点!
php > class Bar { public $foo = 42; }
php > $objBar = new Bar();
PHP提供了一个需要方法php > echo json_encode($objBar);
{"foo":42}
的&teff; \ JsonSerializable。此方法由json_encode()自动调用。
jsonSerialize
我更喜欢这种解决方案,因为不公开公开属性
如果你需要序列化和反序列化php对象,你可以......
class JsonClass implements JsonSerialize {
private $bar;
public function __construct($bar) {
$this->bar = $bar;
}
public function jsonSerialize() {
return [
'foo' => $this->bar,
];
}
}
$ serialized变量包含php > class Classe { public $pub = "bar"; }
php > $obj = new Classe();
php > $serialized = serialize($obj);
php > $original = unserialize($serialized);
php > var_dump($original);
php shell code:1:
class Classe#2 (1) {
public $pub =>
string(3) "bar"
}
。如您所见,它不是json,而是一种允许您使用unserialize函数重新创建原始对象的格式。
答案 1 :(得分:0)
你有几个选择。
选项1:制作您的课程属性public
与sensorario
提到的内容类似,更改属性的可见性,以便可以从类外部访问它,这是您调用json_encode
的位置。
选项2:在类中引入方法/函数以返回编码的JSON对象
在toJson()
课程中设置User
个功能。
当然,还有更多选择 - 例如延长User
以便User
不会被“污染”等等。
但是,是的,一般问题是你的private
属性。