#cpp #json #парсер #mingw
Хочу воспользоваться библиотекой jsoncpp. Скачал с github, поставил с помощью cmake, как указано в документации. Только вот не могу ничего скомпилировать. Пример из документации вылетает с ошибками компиляции: #includeJson::Value root; // starts as "null"; will contain the root value after parsing std::cin >> root; // Get the value of the member of root named 'my-encoding', return 'UTF-32' if there is no // such member. std::string my_encoding = root.get("my-encoding", "UTF-32" ).asString(); // Get the value of the member of root named 'my-plug-ins'; return a 'null' value if // there is no such member. const Json::Value my_plugins = root["my-plug-ins"]; for ( int index = 0; index < my_plugins.size(); ++index ) // Iterates over the sequence elements. yourib::loadPlugIn( my_plugins[index].asString() ); yourlib::setIndentLength( root["my-indent"].get("length", 3).asInt() ); yourlib::setIndentUseSpace( root["my-indent"].get("use_space", true).asBool() ); // ... // At application shutdown to make the new configuration document: // Since Json::Value has implicit constructor for all value types, it is not // necessary to explicitly construct the Json::Value object: root["encoding"] = yourlib::getCurrentEncoding(); root["indent"]["length"] = yourlib::getCurrentIndentLength(); root["indent"]["use_space"] = yourlib::getCurrentIndentUseSpace(); // Make a new JSON document with the new configuration. Preserve original comments. std::cout << root << "\n"; Ошибки: a.cpp:18:4: error: ‘yourib’ has not been declared yourib::loadPlugIn( my_plugins[index].asString() ); ^ a.cpp:20:1: error: ‘yourlib’ has not been declared yourlib::setIndentLength( root["my-indent"].get("length", 3).asInt() ); ^ a.cpp:21:1: error: ‘yourlib’ has not been declared yourlib::setIndentUseSpace( root["my-indent"].get("use_space", true).asBool() ); ^ a.cpp:27:20: error: ‘yourlib’ has not been declared root["encoding"] = yourlib::getCurrentEncoding(); ^ a.cpp:28:28: error: ‘yourlib’ has not been declared root["indent"]["length"] = yourlib::getCurrentIndentLength(); ^ a.cpp:29:31: error: ‘yourlib’ has not been declared root["indent"]["use_space"] = yourlib::getCurrentIndentUseSpace(); ^ Компилятор: MinGW В сети не нашёл детального объяснения использования данной библиотеки. Прошу, поделитесь опытом: как скомпилировать данный пример? UPDATE Если всё запихнуть в метод и сделать некоторые замены, то количество ошибок вообще зашкаливает: #include #include int main(){ Json::Value root; std::cin >> root; std::string my_encoding = root.get("my-encoding", "UTF-32" ).asString(); const Json::Value my_plugins = root["my-plug-ins"]; root["encoding"] = "cp1251"; //std::cout << root << "\n"; return 0; } Часть ошибок: /usr/include/c++/4.8/istream:222:7: note: no known conversion for argument 1 from ‘Json::Value’ to ‘long double&’ /usr/include/c++/4.8/istream:235:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits ; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream ] operator>>(void*& __p) ^ /usr/include/c++/4.8/istream:235:7: note: no known conversion for argument 1 from ‘Json::Value’ to ‘void*&’ /usr/include/c++/4.8/istream:259:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char; _Traits = std::char_traits ; std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf ] operator>>(__streambuf_type* __sb); ^ /usr/include/c++/4.8/istream:259:7: note: no known conversion for argument 1 from ‘Json::Value’ to ‘std::basic_istream ::__streambuf_type* {aka std::basic_streambuf *}’ /usr/include/c++/4.8/istream:779:5: note: template std::basic_istream & std::operator>>(std::basic_istream &, signed char*) operator>>(basic_istream & __in, signed char* __s) ^ /usr/include/c++/4.8/istream:779:5: note: template argument deduction/substitution failed: a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘signed char*’ std::cin >> root; ^ In file included from /usr/include/c++/4.8/iostream:40:0, from a.cpp:2: /usr/include/c++/4.8/istream:774:5: note: template std::basic_istream & std::operator>>(std::basic_istream &, unsigned char*) operator>>(basic_istream & __in, unsigned char* __s) ^ /usr/include/c++/4.8/istream:774:5: note: template argument deduction/substitution failed: a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘unsigned char*’ std::cin >> root; ^ In file included from /usr/include/c++/4.8/iostream:40:0, from a.cpp:2: /usr/include/c++/4.8/istream:732:5: note: template std::basic_istream & std::operator>>(std::basic_istream &, signed char&) operator>>(basic_istream & __in, signed char& __c) ^ /usr/include/c++/4.8/istream:732:5: note: template argument deduction/substitution failed: a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘signed char&’ std::cin >> root; ^ In file included from /usr/include/c++/4.8/iostream:40:0, from a.cpp:2: /usr/include/c++/4.8/istream:727:5: note: template std::basic_istream & std::operator>>(std::basic_istream &, unsigned char&) operator>>(basic_istream & __in, unsigned char& __c) ^ /usr/include/c++/4.8/istream:727:5: note: template argument deduction/substitution failed: a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘unsigned char&’ std::cin >> root; ^ In file included from /usr/include/c++/4.8/istream:882:0, from /usr/include/c++/4.8/iostream:40, from a.cpp:2: /usr/include/c++/4.8/bits/istream.tcc:923:5: note: template std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&) operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) ^ /usr/include/c++/4.8/bits/istream.tcc:923:5: note: template argument deduction/substitution failed: a.cpp:6:14: note: deduced conflicting types for parameter ‘_CharT’ (‘char’ and ‘Json::Value’) std::cin >> root; ^ In file included from /usr/include/c++/4.8/istream:882:0, from /usr/include/c++/4.8/iostream:40, from a.cpp:2: /usr/include/c++/4.8/bits/istream.tcc:955:5: note: template std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*) operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) ^ /usr/include/c++/4.8/bits/istream.tcc:955:5: note: template argument deduction/substitution failed: a.cpp:6:14: note: mismatched types ‘_CharT2*’ and ‘Json::Value’ std::cin >> root; ^ In file included from /usr/include/c++/4.8/string:53:0, from /usr/include/json/value.h:12, from a.cpp:1: /usr/include/c++/4.8/bits/basic_string.tcc:996:5: note: template std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::basic_string<_CharT, _Traits, _Alloc>&) operator>>(basic_istream<_CharT, _Traits>& __in, ^ /usr/include/c++/4.8/bits/basic_string.tcc:996:5: note: template argument deduction/substitution failed: a.cpp:6:14: note: ‘Json::Value’ is not derived from ‘std::basic_string<_CharT, _Traits, _Alloc>’ std::cin >> root;
Ответы
Ответ 1
Вообще-то тут под yourlib подразумевается объект вашего класса, который имеет методы loadPlugIn(), setIndentLength() и т.д. Это не значит, что вам обязательно создавать такой объект и жёстко следовать интерфейсам, которые указаны в примере. Потому что это - всего лишь пример, в нём показано как теоретически можно использовать JSONCPP.Ответ 2
Наконец-то удалось заставить работать эту библиотеку. Я пользовался GCC версии 4.8.4 и Python 2.7.6. Нужно скачать библиотеку с официального GitHub репозитория и разархивировать куда-нибудь. Затем в в терминале перейти в получившуюся директорию и запустить: python amalgamate.py После того, как увидите сообщение Source succesfully amalagated в этой папке появится новая директория dist. Там есть файлы библиотеки, которые нам понадобятся. Содержимое папки dist можно свободно перемещать куда-угодно. Структура у неё следующая : dist |-- json | |-- json-forwards.h | `-- json.h `-- jsoncpp.cpp В качестве примера можно использовать этот код: #include#include int main(){ Json::Value root; // starts as "null"; will contain the root value after parsing root["encoding"] = "UTF-8"; root["indent"]["length"] = "Some text"; root["indent"]["use_space"] = "Some user_space text"; std::cout << root << "\n"; return 0; } Сохраняем этот код в файл с названием a.cpp (можно любое другое) и кладём его рядом с файлом jsoncpp.cpp. А теперь из командной строки выполняем: g++ a.cpp jsoncpp.cpp -std=c++11 При успешной компиляции никакого вывода в консоль тут быть не должно. После этого выполняем: ./a.out и видим результат: { "encoding" : "UTF-8", "indent" : { "length" : "Some text", "use_space" : "Some user_space text" } } Спасибо большое @VladD за помощь в этом запутанном деле. Ответ 3
Немного пофлудю: Установка: sudo aptitude install libjsoncpp-dev Подключаем либу(в данном случае в фале *.pro): LIBS += -ljsoncpp #includeusing namespace Json; ... Value root //манипуляции(согласно документации)... return root.asString(); //видим результат.
Комментариев нет:
Отправить комментарий