JsonCpp
A convenient way to use JsonCpp is adding its amalgamated source. At first, get the source from the official repository,https://github.com/open-source-parsers/jsoncpp,
by entering the following command.
$ git clone https://github.com/open-source-parsers/jsoncpp.git
Go to the source directory, and generate the amalgamated files using
$ python amalgamate.py
The script generates two header files and one source file in 'dist' directory to be added to your project.
As an example create a C++ program, jtest.cpp, as follows.
#include <iostream> #include <string> #include <sstream> #include <json/json.h> using namespace std; int main() { string document(("{\"Serial\" : {\"Baud\":9600, \"Parity\":\"Even\"}}")); stringstream ss; ss.str(document); // Json::Reader reader; Json::CharReaderBuilder reader; Json::Value obj; string errs; // reader.parse(document,obj); if(Json::parseFromStream(reader,ss,&obj,&errs)){ cout << "Serial: baudrate = " << obj["Serial"]["Baud"].asUInt(); cout << " parity = " << obj["Serial"]["Parity"].asString()<<endl; } return 0; }
Put the generated 'jsoncpp.cpp' in the same directory as 'jtest.cpp' and the headers, 'json.h' and 'json-forwards.h', in the subdirectory 'json' as it is. Thereafter, you can compile and run it as shown below.
$ g++ jtest.cpp jsoncpp.cpp -o jtest -I./ $ ./jtest
For visual studio, go to Property pages -> C/C++ -> General -> Additional Include Directories and add the directory for the source files.
$(ProjectDir)\source
More details for JsonCpp can be found at
https://en.wikibooks.org/wiki/JsonCpp [1]
wxJson
There is also a JSON implementation for wxWidgets called wxJSON. You can download the source files at the following link.https://sourceforge.net/projects/wxcode/files/Components/wxJSON/
And extract
$ tar xvzf wxJSON-1.2.1.tar.gz
Go to extracted directory, and then subdirectory '/src' to copy the following three source files into your project.
jsonreader.cpp jsonval.cpp jsonwriter.cpp
Again, in another subdirectory called '/include', copy 'wx' directory which include four header files.
json_defs.h jsonreader.h jsonval.h jsonwriter.h
Alternatively, you can copy them into the include directory of wxWidgets as follows.
$ cd include/wx $ sudo cp *.h /usr/local/include/wx-3.0/wx/
An example wxWidgets program, wxjsontest.cpp, is shown below.
#include "wx/wx.h" #include "wx/json_defs.h" #include "wx/jsonreader.h" #include "wx/jsonval.h" #include "wx/jsonwriter.h" class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(const wxString& title); void OnQuit(wxCommandEvent& event); wxString ReadJson(); wxTextCtrl *txt; private: wxDECLARE_EVENT_TABLE(); }; enum { Minimal_Quit = wxID_EXIT }; wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Minimal_Quit, MyFrame::OnQuit) wxEND_EVENT_TABLE() IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { if ( !wxApp::OnInit() ) return false; MyFrame *frame = new MyFrame("wxJson"); frame->Show(true); return true; } MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title) { wxMenu *fileMenu = new wxMenu; fileMenu->Append(Minimal_Quit, "E&xit\tAlt-X", "Quit this program"); wxMenuBar *menuBar = new wxMenuBar(); menuBar->Append(fileMenu, "&File"); SetMenuBar(menuBar); wxString jresult = ReadJson(); txt = new wxTextCtrl(this,wxID_ANY, jresult, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_RICH , wxDefaultValidator, wxTextCtrlNameStr); } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); } wxString MyFrame::ReadJson() { // the JSON text, stored in a wxString object wxString document(("{\"Serial\" : {\"Baud\":9600, \"Parity\":\"Even\"}}")); wxString mes; // construct the JSON root object wxJSONValue root; // construct a JSON parser wxJSONReader reader; // now read the JSON text and store it in the 'root' structure // check for errors before retreiving values... int numErrors = reader.Parse(document, &root); if (numErrors > 0) { mes = "ERROR: the JSON document is not well-formed"; // const wxArrayString& errors = reader.GetErrors(); return mes; } else { mes = "OK: Reading the JSON document... \n"; } // get the values wxString v1 = root["Serial"]["Baud"].AsString(); wxString v2 = root["Serial"]["Parity"].AsString(); mes += "Serial: baudrate = "+ v1 + ", parity = " + v2; return mes; }
You can use the following CMakeLists.txt file to compile it.
cmake_minimum_required(VERSION 2.8) project( wxjsontest ) find_package(wxWidgets COMPONENTS core net base REQUIRED) include("${wxWidgets_USE_FILE}") include_directories(./wx) add_executable( wxjsontest wxjsontest.cpp jsonreader.cpp jsonval.cpp jsonwriter.cpp ) target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES})
If you got ASSERTION failure warning issue in linking, you can comment out
// wxLogTrace( traceMask, _T("(%s) actual object: %s"), __PRETTY_FUNCTION__, GetInfo().c_str());
in jsonval.cpp in wxJSONValue::Item().
The more details about wxJson can be found at
http://wxcode.sourceforge.net/docs/wxjson/wxjson_tutorial.html [2]
References
[1] WikiBooks. JsonCpp. 2019.url: https://en.wikibooks.org/wiki/JsonCpp.
[2] wxJSON - A brief tutorial
url: http://wxcode.sourceforge.net/docs/wxjson/wxjson_tutorial.html.
No comments:
Post a Comment
Comments are moderated and don't be surprised if your comment does not appear promptly.