Thinkphp框架中 对象转json 为'{}' 或者为"{}" 解决方案

直接上代码

当对象为以下格式案例时,直接json_encodejson_decode是不行的,


object(think\response\Json)#45 (8) {
  ["options"]=>
  array(1) {
    ["json_encode_param"]=>
    int(256)
  }
  ["contentType"]=>
  string(16) "application/json"
  ["data"]=>
  array(2) {
    ["code"]=>
    int(1)
    ["url"]=>
    string(74) "article/content/843de0da41b2a47256fe9ac814a41b6f.png"
  }
  ["charset"]=>
  string(5) "utf-8"
  ["code"]=>
  int(200)
  ["allowCache"]=>
  bool(true)
  ["header"]=>
  array(1) {
    ["Content-Type"]=>
    string(31) "application/json; charset=utf-8"
  }
  ["content"]=>
  NULL
}

详解

一个think\response\Json对象,这是ThinkPHP框架的一部分,用于表示一个JSON响应。这个对象内部包含了很多属性,但关键的数据似乎包含在data属性中,其中包含了code和url。

当尝试将$res对象直接使用json_encode转换为JSON字符串时,结果是"{}"。这是因为json_encode默认情况下只能处理公共属性,而think\response\Json对象内部的有用数据很可能不是直接作为公共属性存储的,或者该对象需要特殊的序列化逻辑。

要正确地将$res对象的有用部分转换为JSON,你需要访问它的data属性。但是,直接访问对象属性可能会受到访问控制(如protected或private属性)的限制,或者框架可能提供了特定的方法来获取这些数据。

在ThinkPHP中,think\response\Json对象应该有方法来获取你想要序列化的数据。如果目标是获取data属性并将其转换为数组,你可能需要查找框架文档或源代码来找到合适的方法或属性访问器。

如果data属性是公共的,或者有一个公共方法来获取它(假设方法名为getData()),你可以这样做:

// 假设有方法获取data
$data = $res->getData(); // 或如果data是公共属性:$data = $res->data;

$json = json_encode($data);
var_dump($json);

$array = json_decode($json, true);
var_dump($array);


posted @ 2024-04-08 02:56  79524795  阅读(62)  评论(0编辑  收藏  举报