【问题标题】:How to parse this specific JSON format using C++ boost如何使用 C++ boost 解析这种特定的 JSON 格式
【发布时间】:2016-08-14 11:08:13
【问题描述】:

我有以下要解析的 json。 我想使用 Boost(属性树)库来解析以下 JSON 文件:

{
  "INTERFACE": "CAN", 
  "UDSDIDS": [
    {
      "NAME": "ECU SERIAL NUMBER", 
      "DID": "0xF18C", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "ECU DEL. ASSEMBLY NUMBER", 
      "DID": "0xF113", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "BOOT SOFT. ID.", 
      "DID": "0xF180", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "BOOT SOFT. VERSION NUMBER", 
      "DID": "0xF109", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "ACTIVE DIAGNOSTIC SESSION", 
      "DID": "0xF186", 
      "FORMAT": "HEX", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "ENERGY SAVING MODE", 
      "DID": "0x100A", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "SVK ACTUAL", 
      "DID": "0xF101", 
      "FORMAT": "HEX", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "CONTROL ENERGY SAVING MODE", 
      "DID": "0x0F0C", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "IN DELIVERY STATUS", 
      "DID": "0xD265", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }, 
    {
      "NAME": "IN DELIVERY START", 
      "DID": "0xA262", 
      "FORMAT": "ASCII", 
      "EXPECTED_VALUE": ""
    }
  ]
}

我想在地图或任何替代类型中收集“INTERFACE”:“CAN”,在向量中收集 UDSDIDS,该向量的每个元素都是“NAME DID FORMAT EXPECTED_VALUE”并遍历它们以获取一些字段在图形用户界面中。

【问题讨论】:

  • 1.你试过什么? 2.这和JavaScript有关吗?
  • 到目前为止,您尝试了什么?展示一些代码,就您在编码时遇到的具体问题提出问题,我们可能会提供帮助。
  • 我正在使用 c++ wxwidgets 库来构建 GUI,我必须阅读 JSON 文件。我在互联网上查看,发现有人使用 boost lib。我下载并编译它,它与一个简单的例子一起工作。我的问题是我以前从未使用过这个库,我需要一些指导,非常感谢。

标签: c++ json boost


【解决方案1】:

未发表评论:

#include <boost/property_tree/json_parser.hpp>
#include <fstream>
#include <iostream>
#include <map>
using boost::property_tree::ptree;

struct UDSDID {
    std::string name, did, format, expected_value;

    static UDSDID read(ptree const& node) {
        return {
            node.get_child("NAME").get_value<std::string>(),
            node.get_child("DID").get_value<std::string>(),
            node.get_child("FORMAT").get_value<std::string>(),
            node.get_child("EXPECTED_VALUE").get_value<std::string>(),
        };
    }

    friend std::ostream& operator<<(std::ostream& os, UDSDID const& u) {
        return os 
            << "{name:" << u.name
            << ",did:" << u.did
            << ",format:" << u.format
            << ",expected_value:" << u.expected_value
            << "}";
    }
};

auto read(std::string const& fname) {
    ptree pt;
    std::ifstream ifs(fname);
    read_json(ifs, pt);

    return pt;
}

int main() {
    auto data = read("input.txt");

    std::vector<UDSDID> udsdids;
    std::map<std::string, std::string> other;

    for (auto& node : data) {
        if (node.first == "UDSDIDS") {
            for (auto& udsdid : node.second)
                udsdids.push_back(UDSDID::read(udsdid.second));
        } else {
            other[node.first] = node.second.get_value<std::string>();
        }
    }

    for (auto& p : other) {
        std::cout << p.first << ": " << p.second << "\n";
    }
    for (auto& u : udsdids) {
        std::cout << u << "\n";
    }
}

打印:

INTERFACE: CAN
{name:ECU SERIAL NUMBER,did:0xF18C,format:ASCII,expected_value:}
{name:ECU DEL. ASSEMBLY NUMBER,did:0xF113,format:ASCII,expected_value:}
{name:BOOT SOFT. ID.,did:0xF180,format:ASCII,expected_value:}
{name:BOOT SOFT. VERSION NUMBER,did:0xF109,format:ASCII,expected_value:}
{name:ACTIVE DIAGNOSTIC SESSION,did:0xF186,format:HEX,expected_value:}
{name:ENERGY SAVING MODE,did:0x100A,format:ASCII,expected_value:}
{name:SVK ACTUAL,did:0xF101,format:HEX,expected_value:}
{name:CONTROL ENERGY SAVING MODE,did:0x0F0C,format:ASCII,expected_value:}
{name:IN DELIVERY STATUS,did:0xD265,format:ASCII,expected_value:}
{name:IN DELIVERY START,did:0xA262,format:ASCII,expected_value:}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2018-03-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多