【问题标题】:Json_encode returns json cells as stringJson_encode 将 json 单元格作为字符串返回
【发布时间】:2018-02-08 19:29:57
【问题描述】:

我有一个database structure like this. 我愿意将 row 作为 Json.net 的 json 对象。

我的php代码是这样的

$check_query = mysqli_query($conn, "select * from users where name = '$name' and password = '$pass'");
$rows = array();
    while($r = mysqli_fetch_assoc($get_query)) {
       $rows[] = $r;
    }
if(count($rows) > 0) {
echo json_encode($rows[0]);
}

我得到的是这样的 json。

{"unique_id":"pcg9sy26","name":"w","password":"w","mail":"alpsavrum@gmail.com","age":18,"locale":"Turkey","city":"Istanbul","subscriptions":"[\"electronics\", \"vacations\"]","history":null,"token":"12562f39b990da0433d7be71992ed634"}

如您所见,订阅值是字符串。我需要它看起来像数组。

{"unique_id":"pcg9sy26","name":"w","password":"w","mail":"alpsavrum@gmail.com","age":18,"locale":"Turkey","city":"Istanbul","subscriptions":[\"electronics\", \"vacations\"],"history":null,"token":"12562f39b990da0433d7be71992ed634"}

有什么办法可以做到这一点。 ?

非常感谢!

【问题讨论】:

  • 第一个是有效的 JSON。第二个是垃圾。如果你想要一个 JSON 数组,你需要删除那些反斜杠。
  • 这不是问题,Json.net 处理反斜杠的事情。我需要去掉这些引号。
  • 如果它处理它,那就是一个错误。 JSON Lint 对第二个漏洞版本表示强烈反对。你怎么得到这个字符串?是你正在创作的东西还是你收到的东西?
  • 我的 json 解析器 tadman 没有问题,我只需要将该数组作为数组而不是字符串。
  • 你能回答这个问题吗:你是构造这个JSON还是接收它?数组值是双重编码的。您需要单独对其进行 JSON 解码以获取数组。

标签: php arrays json


【解决方案1】:

您检索数据的方式是为您提供 JSON 值作为字符串。如果它实际上是 JSON 数据,将它作为 JSON 存储在数据库中是一个好主意,但 mysqli 驱动程序不会自动为您反序列化它。如果你想要那种行为,你需要使用 ORM。

当您遇到双重编码问题时,请与var_dump 联系以了解您实际使用的是什么。这将显示 subscriptions 键包含 JSON 字符串,而不是预期的数组。

你需要做的是在 JSON 编码之前手动反序列化它:

if (isset($r['subscriptions'])) {
  $r['subscriptions'] = json_decode($r['subscriptions']);
}

$rows[] = $r;

您需要对结果可能包含的所有 JSON 编码字段执行此操作。

通过这种方式,您将 JSON 编码为正确的 PHP 数据结构,而不是部分 PHP 和部分 JSON 字符串。

【讨论】:

    【解决方案2】:

    用你正在阅读的任何语言尝试 json decode 函数。 解码 JSON 响应,然后打印出来

    【讨论】:

    • 当我打印它时,如我所说的那样打印出来。问题是我在 php 中编码时无法将 json 数组打印为数组。
    • 你完成 JSON 解码了吗?并且订阅是从响应端以数组形式发送的
    • Json 编码将数据编码成字符串..因此你得到的是 JSON 字符串
    • 我不需要解码任何东西,我需要将 sql 查询编码为 json 以进行跨设备通信。因此,我正在编码一行查询。我有一个将订阅保存为 json 值的列(我将仅将其用于数组),但是当我对所有查询进行编码时,该列以字符串形式返回。这就是问题所在。
    • 你能提供你正在编码的原始数据吗..以便我可以更好地帮助你
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2018-02-23
    • 2022-06-10
    相关资源
    最近更新 更多