【问题标题】:json_encode empty with no error [duplicate]json_encode 为空且没有错误 [重复]
【发布时间】:2023-03-13 04:07:02
【问题描述】:

我有一个对象。我需要将其转换为 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;
        }
    }
?>

希望有人能帮帮我

【问题讨论】:

标签: php json


【解决方案1】:

这是因为你的类的属性是私有的。

只有私有属性的示例类...

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 > echo json_encode($objBar);
{"foo":42}

\JsonSerializable

PHP 提供了一个需要方法jsonSerialize 的'interafce \JsonSerializable。该方法由 json_encode() 自动调用。

class JsonClass implements JsonSerialize {
    private $bar;
    public function __construct($bar) {
        $this->bar = $bar;
    }
    public function jsonSerialize() {
        return [
            'foo' => $this->bar,
        ];
    }
}

我更喜欢这个解决方案,因为不利于公开属性

序列化和反序列化 ...

如果您需要序列化和反序列化 php 对象,您可以...

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"
}

$序列化变量包含O:6:"Classe":1:{s:3:"pub";s:3:"bar";}。如您所见,它不是 json,而是一种允许您使用 unserialize 函数重新创建原始对象的格式。

【讨论】:

  • 啊!我正要使用 JsonSerializable 接口发布答案。你打败了我:-p 我完全同意。 JsonSerializable 是最干净的方法。
  • 是否有 JsonDeserializable 接口可以将编码还原回对象?
  • @LarsDormans - 不。当它转换为 JSON 时,它只是一个 JSON 对象。 JSON 是一种用于呈现数据的简单表示法,它没有任何函数或类似概念。它不再是你的课了。
  • 否,但您可以$serialized = serialize($obj) 并使用$original = unserialize($serialized) 反序列化。序列化的对象与 json 完全不同,但它允许您通过 http 请求发送对象^_^
  • 请注意serialize()。这会创建您的类的序列化版本,但它不是“通用”表示法。它是特定于 PHP 的,因此如果您希望能够以其他语言使用该数据,则需要自己为其创建解析器。
【解决方案2】:

这里有几个选项。

选项 1:将您的类属性设为 public

就像sensorario 提到的那样,更改属性的可见性,以便可以从类外部访问它,这就是您调用json_encode 的地方。

选项 2:在类中引入方法/函数以返回编码后的 JSON 对象

User 类中有一个 toJson() 函数。

当然,还有更多选择 - 例如扩展 User 以使 User 不被“污染”等。

但是,是的,一般问题是您的 private 属性。

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2020-09-22
    • 2020-08-16
    • 2017-10-30
    相关资源
    最近更新 更多