如何使用C ++ boost解析这个特定的JSON格式

时间:2016-08-14 11:08:13

标签: c++ json boost

我有以下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 个答案:

答案 0 :(得分:0)

未经评论发表:

#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:}