c++ - 为什么我不能使用 [] 运算符访问 nlohmann 的 C++ JSON 库中的数组?

标签 c++ arrays json twitter nlohmann-json

我正在使用 this用于 C++ 的 JSON 库,以便从 Twitter 的 API 获取信息,它向我的程序返回一个 JSON 数组(我存储在 responseData 中)。但是当我尝试访问返回数组中的“name”时,它不允许我这样做。

这是我在进程终止后得到的错误:

terminate called after throwing an instance of 'nlohmann::detail::type_error'
what():  [json.exception.type_error.305] cannot use operator[] with array

这是我正在处理的代码部分:

    if(!responseData.empty()&&response_code==0) {
    std::cout<<responseData<<"<---\n";
    std::cout<<nlohmann::json::parse(responseData.c_str())["name"]<<"<!-\n";
}

最佳答案

我对 JSON 知之甚少,这是我第一次接触上述库,但我觉得这个问题很有趣,代码对我来说是一个挑战,所以我会尝试解释我的发现。

发生的事情是你使用 operator[]()访问 basic_json<>键对象,而不是索引,对象应该是内部类型 value_t::object (enum class value_t {})。如果该条件失败,则会抛出您看到的异常,并报告对象的实际类型。据我所知,对象的类型由解析器根据您传递给它的字符串的语法自动确定。 (好的,它可以不仅仅是一个字符串,据我所知,还有一个可以表示线性范围字符的各种实体的重载列表。)以方括号开头的数据报告“数组” "[" .

因此,为了确定发生了什么,我们需要查看解析器正在接收的实际数据。正如我在上面提到的,似乎有一个类型的自动推导,并且每种类型只允许一定范围的操作。要使用键值访问器,字符串看起来应该代表一个对象,并以大括号 "{" 开头。 .


给定示例数据:

[
    {
    "trends":
    [
        {
        "name":"#XboxE3",
        "url":"http:\/\/twitter.com\/search?q=%23XboxE3",
        "promoted_content":null,
        "query":"%23XboxE3",
        "tweet_volume":371447
        },
        {
        "name":"Anthem",
        "url":"http:\/\/twitter.com\/search?q=Anthem",
        "promoted_content":null,
        "query":"Anthem",
        "tweet_volume":71013
        }
    ],
    "as_of":"2017-06-11T22:57:57Z",
    "created_at":"2017-06-11T22:55:37Z",
    "locations":
    [
        {
        "name":"Worldwide",
        "woeid":1
        }
    ]
    }
]

这似乎是一个分层数据结构,因此可以到达 "name"元素,你需要下降到它。最顶层的元素是由 [] 表示的数组.它包含一个元素——一个未命名的对象。我们需要 "trends"大批。在那个数组中,每个元素都是一个对象。所以我认为查询看起来像这样:

auto response = nlohmann::json::parse(responseData.c_str());
std::cout << response[0]["trends"][0]["name"];

operator[]()的应该是可链接的,因为它们返回对 basic_json<> 的引用目的。这就是运算符链接的实现方式,链接本身就是一个典型的设计。 operator<<() 中使用了相同的想法的 std::cin .

关于c++ - 为什么我不能使用 [] 运算符访问 nlohmann 的 C++ JSON 库中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477720/

相关文章:

javascript - 从数组数组中删除

java - POST Android json 数据

c++ - Kate 之类的程序中使用的 Kde 栏的小部件名称是什么? (内图)

c++ - 如何在 C++ 中生成 10 个球体

c++ - 从字符串到字符串流再到 vector<int>

c - 将输入获取到动态分配的内存中,然后返回指针

c++ - 数据库中的自动 id 与通过代码自动 id

JavaScript:在空间上划分数组元素并添加到同一个列表

javascript - 为什么我的 eval 没有将 json 字符串转换为对象

java - 使用传递的泛型进行 GSON 反序列化