我有以下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"并通过它们进行迭代,将一些文件归结为图形用户界面。
答案 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:}