Запись строк файла в JSON с использованием C ++ и jsoncpp

У меня есть текстовый файл, который я пытаюсь преобразовать в объект JSON, используя jsoncpp в моем приложении C ++.

Содержимое файла отформатировано так:

system type : Atheros AR7241 rev 1
machine     : Ubiquiti UniFi
processor   : 0
cpu model   : MIPS 24Kc V7.4
BogoMIPS    : 259.27

Который кажется довольно удобным для начала. Мне нужно, чтобы ключи соответствовали первому столбцу, а значения — второму столбцу:

{ "meh" : [{ "system type" : "Atheros AR7241 rev 1", "machine" : "Ubiquiti UniFi" ...

Я могу написать файл в его целостности для объекта JSON. Но это насколько я могу получить …

Json::Value root;
string line;

ifstream myfile( "/proc/cpuinfo" );
if (myfile)
{
while (getline( myfile, line ))
{
root["test"] = line;
cout << root;
}
myfile.close();
}

Что близко, но, очевидно, дает мне JSON, например, так:

{
"test" : "system type   : Atheros AR7241 rev 1"}

Я новичок в C ++, я не знаю как разделить строки в толстой кишке и использовать первую половину для ключа вместо «теста». Может кто-нибудь предложить способ пойти по этому поводу?

0

Решение

Я бы предложил использовать комбинацию «Строка :: найти ()» а также «Строка :: зиЬзЬги ()».

Или что-то вроде регулярных выражений, но я думаю, что нужно перейти к стандартной библиотеке.

Пример:

std::string::size_type n;
std::string key;
std::string value;

n = line.find(':');

key = line.substr( 0, n );
value = line.substr( n+1 );

Тогда, возможно, понадобится удалить ключ и значения из белых символов. Я не буду освещать это, так как на SO так мало вопросов и ответов, как это сделать. Например:

  1. Подобна ли функция в C ++ для Python’s strip ()?
  2. Какой лучший способ обрезать std :: string?

РЕДАКТИРОВАТЬ:

Полный пример кода split.cpp:

/// TRIMMING STUFF
// taken from https://stackoverflow.com/a/217605/1133179
#include <algorithm>
#include <functional>
#include <cctype>
#include <locale>

// trim from start
static inline std::string &ltrim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
return s;
}

// trim from end
static inline std::string &rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
return s;
}

// trim from both ends
static inline std::string &trim(std::string &s) { return ltrim(rtrim(s)); }
/// ~~~ TRIMMING STUFF ~~~#include <string>
#include <iostream>

int main(){
std::string::size_type n;
std::string key;
std::string value;

std::string line = "system type : Atheros AR7241 rev 1";

n = line.find(':');

key = line.substr( 0, n );
value = line.substr( n+1 );
std::cout << "line: `" << line << "`.\n";
std::cout << "key: `" << key << "`.\n";
std::cout << "value: `" << value << "`.\n";///  With trimming

std::cout << "{\n "json" : [{ \"" << trim(key) << "\" : \"" << trim(value) << "\" }]\n}\n";
}

Выполнение:

luk32:~/projects/tests$ g++ ./split.cpp
luk32:~/projects/tests$ ./a.out
line: `system type : Atheros AR7241 rev 1`.
key: `system type `.
value: ` Atheros AR7241 rev 1`.
{
"json" : [{ "system type" : "Atheros AR7241 rev 1" }]
}

Я думаю, что все в порядке.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]