2015-12-09 2 views
1

Так что я читаю некоторые значения от датчика через SPI. Я уже преобразовал эти значения в строку (не знаю, должен ли я, но я что-то пытался). Теперь я не могу преобразовать их в формат json. Вот мой код:Как преобразовать строку в json-формат в C++?

#include "ad7490Spi.h" 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 

using namespace std; 

string IntToString (int a2dVal) 
{ 
    ostringstream oss; 
    oss << a2dVal; 
    return oss.str(); 
} 

int main(void) 
{ 
    ad7490Spi a2d("/dev/spidev0.0", SPI_MODE_0, 1000000, 16); 
    int i = 5; 
    int a2dVal = 0; 
    int a2dChannel = 0; 
    unsigned char data[3];  

    while(i > 0) 
    { 
     data[0] = 1; // first byte transmitted -> start bit 
     data[1] = 0b1000000000000000 |(((a2dChannel & 15) << 4)); // second byte transmitted -> (SGL/DIF = 1, D2=D1=D0=0) 
     data[2] = 0; // third byte transmitted....don't care 

     a2d.spiWriteRead(data, sizeof(data)); 

     a2dVal = 0; 
       a2dVal = (data[1]<< 8) & 0b1100000000; //merge data[1] & data[2] to get result 
       a2dVal |= (data[2] & 0xff); 
     sleep(1); 

     i--;   

    string result = IntToString (a2dVal); 
    cout << " " + result + " "; 

    } 

return 0; 
} 

Это результат:

1023 1023 1023 1023 1023 

Я хочу, чтобы результат должен быть таким образом:

{ 
    "values": [ "1023", "1023", "1023", "1023", "1023" ] 
} 

Можете ли вы, ребята, помочь мне с этим?

+0

Ваш лучший выбор для всех, кроме самых тривиальных примеров, заключается в использовании библиотеки 'json'. –

+2

Даже для тривиальных примеров используйте библиотеку json. – PaulMcKenzie

ответ

0

этот код:

#include <iostream> 
#include <string> 
#include <iomanip> 
#include <vector> 

void print_values(std::ostream& os, const std::vector<int>& v) 
{ 
    using namespace std; 

    os << "{\n"; 
    os << "\t\"values\" : ["; 
    auto sep = " "; 
    for (const auto& i : v) { 
     os << sep << quoted(to_string(i)); 
     sep = ", "; 
    } 
    os << " ]\n"; 
    os << "}\n"; 
} 

auto main() -> int 
{ 
    print_values(std::cout, {1,2,3,4,5,6}); 

    return 0; 
} 

приводит:

{ 
    "values" : [ "1", "2", "3", "4", "5", "6" ] 
} 

обновление:

эта версия будет правильно вести себя с C++ 11 компилятором (и выделяет некоторые 'новые' функции из C++ 14 - но давайте не будем жить в каменном веке слишком долго, а?)

#include <iostream> 
#include <string> 
#include <iomanip> 
#include <vector> 

#if __cplusplus >= 201402L 
#else 
std::string quoted(const std::string& s) { 
    using namespace std; 
    return string(1, '"') + s + '"'; 
} 
#endif 

void print_values(std::ostream& os, const std::vector<int>& v) 
{ 
    using namespace std; 

    os << "{\n"; 
    os << "\t\"values\" : ["; 
    auto sep = " "; 
    for (const auto& i : v) { 
     os << sep << quoted(to_string(i)); 
     sep = ", "; 
    } 
    os << " ]\n"; 
    os << "}\n"; 
} 


auto main() -> int 
{ 
    using namespace std; 

    print_values(cout, 
#if __cplusplus >= 201402L 
       {1,2,3,4,5,6} 
#else 
       []() -> vector<int> { 
        vector<int> v; 
        for (int i = 1 ; i < 7 ; ++i) 
         v.push_back(i); 
        return v; 
       }() 
#endif 
       ); 

    return 0; 
} 
+0

В нем говорится: «Ошибка:« процитировано »не было объявлено в этой области ...». Как я могу это решить? –

+0

@ JoãoAmaro add --std = C++ 1y или --std = C++ 14 в параметры командной строки. http://en.cppreference.com/w/cpp/io/manip/quoted –

+0

Спасибо, это сработало. Но теперь он не может читать spi. Говорит: «Принимая адрес массива времени выполнения retVal = ioctl (this-> spifd, SPI_IOC_MESSAGE (длина), &spi; –

0

Как вы, кажется, используете C++ и STL во встроенной системе, я бы рекомендовал вам использовать picojson. Это всего лишь библиотека с 1 заголовком и будет лучше, чем сама реализация сериализации с некоторыми манипуляциями с строками. Если вы это сделаете, он будет более уродливым позже, если вы продлеваете свой json-выход.