首页 > 解决方案 > 为单个值解析未知格式的 JSON 响应

问题描述

我正在创建一个从多个 api 获取数据的股票筛选器。我想为单个值解析来自各种 api 的 api 响应。

我正在使用以不同嵌套格式返回 JSON 的股票数据 api。由于 JSON 的格式可以不同,例如 root 可以是一个对象或一个数组。我无法理解如何去做。当格式已知时,我已成功解析 JSON 响应。我正在使用 qt,没有 3rd 方库,这似乎需要您像我之前所做的那样明确解析这些响应。如何创建一个通用的 JSON 解析器?这甚至可能吗?

示例:对于这个 JSON 响应.. 我想解析“值”

{
  "historical_data": [
    {
      "date": "2019-06-28",
      "value": 197.92
    }
  ],
  "security": {
    "id": "sec_agjrgj",
    "company_id": "com_NX6GzO",
    "stock_exchange_id": "sxg_ozMr9y",
    "name": "Apple Inc",
    "code": "EQS",
    "currency": "USD",
    "ticker": "AAPL",
    "composite_ticker": "AAPL:US",
    "figi": "BBG000B9Y5X2",
    "composite_figi": "BBG000B9XRY4",
    "share_class_figi": "BBG001S5N8V8"
  },
  "next_page": null
}

我还想解析这个 JSON 响应以获取“值”

{
  "date": "2019-06-28",
  "value": 197.92
}

我试图不为我使用的每个 api 编写解析器函数。我希望能够找到 JSON 是否有“值”,如果有的话.. 返回它的值。

标签: c++jsonqtparsing

解决方案


您可以为此使用JsonPath。例如,使用 JsonPath 的jsoncons实现,可以这样写

#include <iostream>
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpath/json_query.hpp>

using namespace jsoncons;

int main()
{
    std::string data = /* your JSON response */;

    json root = json::parse(data);
    // json_query returns an array of items that match the JsonPath expression
    json result = jsonpath::json_query(root, "$..value");
    for (const auto& item : result.array_range())
    {
        std::cout << item << "\n";
    }
}

输出:

197.92

推荐阅读