Skip to content

Ichishino/JSonity

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 

Repository files navigation

JSonity

JSonity is JSON utility for C++

Features

  • JSON Parsing and Serializing.
  • Serializing User Objects into JSON string.
  • Serializing STL (map, vector, list, ...) into JSON string directly.
  • Support Unicode (wchar_t, char16_t, char32_t).
  • Support I/O stream interface.
  • One header file only.
  • Simple easy interface.

Examples

// If using <std::list, set, deque, array, forward_list, ...>
// Include them before "jsonity.hpp"
//
// #include <list>
// ...

#include "jsonity.hpp"

using namespace jsonity;

Parse JSON string

// example1_1

std::string jsonStr =
    "{"
        "\"name1\": 100,"
        "\"name2\": true,"
        "\"name3\": ["
            "10,"
            "20,"
            "30"
        "],"
        "\"name4\": \"data\""
    "}";

Json::Value v;
Json::decode(jsonStr, v);   // parse

size_t size = v.getSize();  // 4

bool check = v.hasName("name1");  // true

int n1 = (int)v["name1"].getNumber(); // 100
int n2 = v["name1"];                  // 100

bool b1 = v["name2"].getBoolean(); // true
bool b2 = v["name2"];              // true

Json::Array& arr1 = v["name3"].getArray();
Json::Array& arr2 = v["name3"];

size_t array_size = v["name3"].getSize();  // 3

int arr_n1 = arr1[0];   // 10
int arr_n2 = arr1[1];   // 20
int arr_n3 = arr1[2];   // 30

const std::string& str1 = v["name4"].getString();   // "data"
const std::string& str2 = v["name4"];               // "data"

try
{
    b1 = v["name4"].getBoolean(); // exception
}
catch (const Json::TypeMismatchException&)
{
    // type mismatch
}
// example1_2

std::string jsonStr = "{ ... }";

Json::Error err;	// error info
Json::Value v;

if (!Json::decode(jsonStr, v, &err))	// parse
{
	// error

	printf("Index: %d\n",
		err.getCursor().getPos() + 1);

	printf("Line: %d Col: %d\n",
		err.getCursor().getRow() + 1,
		err.getCursor().getCol() + 1);
}
// example1_3

std::ifstream ifs("json.dat", std::ios::in | std::ios::binary);

Json::Value v;
Json::decode(ifs, v);   // parse
// example1_4

std::ifstream ifs("json.dat", std::ios::in | std::ios::binary);

Json::Value v;
ifs >> v;         // parse

if (!ifs)
{
	// error
}
// example1_5

std::string jsonStr =
    "{"
        "\"name1\": {"
            "\"data1\": ["
                "-3.14,"
                "\"aaaa\","
                "true,"
                "{"
                    "\"subdata1\": ["
                        "600"
                    "]"
                "}"
            "]"
        "}"
    "}";

Json::Value v;
Json::decode(jsonStr, v);   // parse

double d = v["name1"]["data1"][0];    // -3.14
const std::string& str = v["name1"]["data1"][1]; // "aaaa"
bool b = v["name1"]["data1"][2];      // "true"
int n = v["name1"]["data1"][3]["subdata1"][0];  // 600

std::list<Json::Value> listVal;
v.findRecursive("subdata1", listVal);	// find recursively

Json::Value& v2 = *listVal.begin();

n = v2[0]; // 600

Serialize object to JSON string

// example2_1

Json::Object root_obj;

root_obj["name1"] = 100;
root_obj["name2"] = true;
root_obj["name3"] = "data_string";
root_obj["name4"] = Json::null();

Json::Array arr(3);
arr[0] = "test";
arr[1] = -400;
arr[2] = false;

root_obj["name5"] = arr;

Json::Object obj;
obj["xxx"] = -1.5;
obj["yyy"] = true;
obj["zzz"] = "test_test";

root_obj["name6"] = obj;

std::list<int> list;  // any STL type (map, vector, list, set, ...)
list.push_back(444);
list.push_back(777);

root_obj["name7"] = list;

std::string jsonStr;
Json::encode(root_obj, jsonStr);  // serialize

// jsonStr ==
//  {"name1":100,"name2":true,"name3":"data_string","name4":null,
//  "name5":["test",-400,false],"name6":{"xxx":-1.5,"yyy":true,"zzz":"test_test"},
//  "name7":[444,777]}"
// example2_2

Json::Object root_obj;

...

std::ofstream ofs("json.dat",
	std::ios::out | std::ios::binary | std::ios::trunc);

Json::encode(root_obj, ofs);  // serialize (redirect)
// example2_3

Json::Object root_obj;

...

std::cout << root_obj << std::endl;  // serialize (redirect)
// example2_4

// User Object
class MyData : public Json::UserValue<MyData>
{
public:
    MyData(int data1, const std::string& data2)
    {
        data1_ = data1;
        data2_ = data2;
    }
    MyData(const MyData& other)
    {
        data1_ = other.data1_;
        data2_ = other.data2_;
    }
    ~MyData()
    {
    }

    int getData1() const
    {   return data1_;    }
    const std::string& getData2() const
    {   return data2_;    }

protected:

    // Encode
    virtual void encode(Json::EncodeContext& ctx) const
    {
        std::ostringstream oss;
        oss << data2_ << "-" << data1_;

        Json::encodeString(ctx, oss.str());
    }

private:
    int data1_;
    std::string data2_;
};


Json::Object root_obj;

// User Object

MyData myData(99, "777");
root_obj["name1"] = myData;

MyData* myDataPtr = new MyData(55, "AAA");
root_obj["name2"] = myDataPtr;

std::string jsonStr;
Json::encode(root_obj, jsonStr);  // serialize

// jsonStr == {"name1":"777-99","name2":"AAA-55"}

delete myDataPtr;
// example2_5

std::map<std::string, std::string> map;  // any STL type (map, vector, list, set, ...)

map["name1"] = "data1";
map["name2"] = "data2";
map["name3"] = "data3";

std::string jsonStr;
Json::encode(map, jsonStr);  // serialize

// jsonStr == {"name1":"data1","name2":"data2","name3":"data3"}
// example2_6

std::map<std::string, std::list<MyData> > map;  // any STL type (map, vector, list, set, ...)

// User Object

std::list<MyData> list;
list.push_back(MyData(66, "666"));
list.push_back(MyData(77, "777"));
list.push_back(MyData(88, "888"));

map["name"] = list;

std::string jsonStr;
Json::encode(map, jsonStr);  // serialize

// jsonStr == {"name":["666-66","777-77","888-88"]}
// example2_7

std::vector<int> list;  // any STL type (map, vector, list, set, ...)

list.push_back(100);
list.push_back(200);
list.push_back(300);

std::string jsonStr;
Json::encode(list, jsonStr);  // serialize

// jsonStr == [100,200,300]
// example2_8

std::map<std::string, std::vector<int> > map;

std::vector<int> vec(3);
vec[0] = 100;
vec[1] = 200;
vec[2] = 300;

map["test"] = vec;

Json::EncodeStyle es1;
es1.setStandardStyle();

std::string jsonStr1;
Json::encode(map, jsonStr1, &es1);  // serialize (Human Readable)

/* jsonStr1 ==
    {
        "test": [
            100,
            200,
            300
        ]
    }
*/

Json::EncodeStyle es2;
es2.setQuat(true);
es2.setPrintNewLine(true);
es2.setEscapeCtrlChar(true);
es2.setNewLine(true, false);

std::string jsonStr2;
Json::encode(map, jsonStr2, &es2);  // serialize (for C++ Program)

/* jsonStr2 ==
    "{\n"
        "\"test\": [\n"
            "100,\n"
            "200,\n"
            "300\n"
        "]\n"
    "}\n"
*/

Compare object to JSON string

// example3_1

std::string jsonStr =
    "{"
        "\"aaa\": 100,"
        "\"bbb\": \"data\""
    "}";

Json::Value v;
Json::decode(jsonStr, v);

bool result = Json::equal(v, jsonStr);  // true
// example3_2

std::list<int> list;
list.push_back(100);
list.push_back(200);
list.push_back(300);

bool result1 = Json::equal(list, "[ 100, 200, 300 ]");  // true

bool result2 = Json::equal(list, "[ 300, 100, 200 ]");  // true

bool result3 = Json::equal(list, "[ 300, 100, 200 ]", false);  // false

Releases

No releases published

Packages

 
 
 

Languages