2016-08-14 5 views
-3

У меня есть следующий json, который я пытаюсь разобрать. Я хотел бы использовать подталкивание (Tree Property) библиотека для разбора следующий JSON файл:Как разобрать этот конкретный формат JSON с помощью повышения C++

{ 
    "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": "" 
    } 
    ] 
} 

я хотел бы собрать «ИНТЕРФЕЙС»: «CAN» в карте или любого другого альтернативного типа и UDSDIDS в вектор, каждый элемент этого вектора представляет собой «ИМЯ ДИДОМ ФОРМАТ EXPECTED_VALUE» и перебирает их, чтобы упаковать некоторые файлы в графическом пользовательском интерфейсе.

+0

1. Что вы пробовали? 2. Связано ли это с JavaScript? – vlaz

+2

И что вы пробовали? Покажите код, задавайте вопросы по конкретным проблемам, возникающим при кодировании, и мы можем помочь. –

+0

Я использую библиотеку wxwidgets C++ для создания графического интерфейса, и мне нужно прочитать файл JSON. Я посмотрел в Интернете, и я нашел людей, использующих boost lib. Я загружаю и компилирую его, и он работает с простым примером. моя проблема в том, что я никогда не использую эту библиотеку раньше, и мне нужно некоторое руководство, спасибо большое. – sentar

ответ

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:} 
Смежные вопросы