【问题标题】:Decoding JSON using PHP from Mongo使用来自 Mongo 的 PHP 解码 JSON
【发布时间】:2014-05-24 18:36:24
【问题描述】:

我已经看过这个帖子:PHP decode nested JSON 并没有设法用它来解决我的问题。

我目前正在从 Mongo 抓取一个 JSON 对象,但在从嵌套对象抓取信息时遇到问题。

{
"adminLevel" : 200,
    "chat" : true,
    "clans" : [
            BinData(0,"wcXHR577OVBXfy9JwEf5gQAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
    ],
    "experience" : NumberLong(70003),
    "kitNew" : {
            "converted" : true,
            "items" : {
                    "ak47" : {
                            "killCount" : 5,
                            "selected" : false,
                            "unlocked" : 1
                    },
                    "hub-knife" : {
                            "selected" : false
                    },
                    "assault" : {
                            "selected" : false,
                            "unlocked" : 1
                    },
                    "pistol" : {
                            "deathWhileSelectedCount" : 3,
                            "killedBySelectedCount" : 1,
                            "killWhileSelectedCount" : 1,
                            "selected" : false,
                            "unlocked" : 1
                    },

                    "m1014" : {
                            "deathWhileSelectedCount" : 3,
                            "killedBySelectedCount" : 1,
                            "killCount" : 17,
                            "killWhileSelectedCount" : 1,
                            "killedByCount" : 1,
                            "selected" : false,
                            "unlocked" : 1
                    },
            },
    },
    "points" : NumberLong(87167),
}

我的目的是打印出每个项目的信息,我的PHP代码如下

// execute query
// retrieve all documents
$query = array("lastKnownUsername"  => "Strubo");
$cursor = $collection->find($query);
$array = json_decode($cursor, true);
$items = $array->kitNew->items;

foreach($items as $item){
    echo "<tr>";
        echo "<td>" . $item . "</td>";
        echo "<td>" . $item->killCount . "</td>";
    echo "<td>" . $item->killedByCount . "</td>";
        echo "<td>" . $item->selected . "</td>";
    echo "<td>" . $item->unlocked . "</td>";
    echo "</tr>";
}

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
        die('Error connecting to MongoDB server');
} catch (MongoException $e) {
    die('Error: ' . $e->getMessage());
}

我知道连接到数据库没有问题,也没有任何环境问题,因为抓取数据的其他显示工作正常。这里的问题只是嵌套。

谢谢。

【问题讨论】:

    标签: php json mongodb mongodb-php


    【解决方案1】:

    MongoDB 确实将数据存储为 JSON。

    您粘贴的文档似乎是从 shell 复制和粘贴的。这也不是 JSON 格式。 这种格式称为扩展 JSON - 并且是 MongoDB shell 如何在 javascript 中表示数据。 MongoDB 网站上的大多数示例也使用这种格式,因为它简单易行。因此,MongoDB 官方文档使用 shell 来演示功能和输出,而不是有几十种不同的输出格式(针对每种语言驱动程序)。

    实际的底层格式称为二进制 JSON (BSON)。你永远不会看到这种格式,也永远不会与之互动。

    当您在 PHP 中与 MongoDB 交互时,您所需要知道的就是保存一个 PHP 数组。从 MongoDB 返回的数据也是一个 PHP 数组。底层磁盘格式不相关。

    您永远不必调用 json_encode() 或 json_decode()。

    $collection-&gt;find($query) 方法返回一个名为 MongoCursor 的对象。你应该遍历这个对象来得到结果,这将是一个 PHP 数组。

    foreach($collection->find($query) as $result) {
        var_dump($result);
    }
    

    此代码示例将一次 var_dump() 一个结果。这个result 称为“MongoDB 文档”,类似于“MySQL 行”。就像 MySQL 一样,您不必知道底层协议是什么,或者底层磁盘格式是什么 - 这对您没有影响。

    我强烈建议你阅读 MongoDB PHP 驱动教程:http://us2.php.net/manual/en/mongo.tutorial.php

    这应该可以更好地解释这个概念,以及驱动程序的工作原理:)

    【讨论】:

    • 这个信息非常好。我将数据解释为 JSON 对象,而不是 PHP 数组。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多