Giter Site home page Giter Site logo

alpsmonaco / jsonserializer Goto Github PK

View Code? Open in Web Editor NEW
6.0 1.0 0.0 209 KB

a library aims to convert json string to C++ data struct in modern,fluent and fast way. Runtime safety and No C++ Exception.

License: MIT License

C++ 96.13% C 3.87%
bind cpp fluent json map modern header-only no-exception dynamic-language-like runtime-safety template cross-platform easy-to-use flexible type-safety bind-by-reference linux windows

jsonserializer's Introduction

jsonserializer

This library aims to convert json string to C++ data struct in modern,fluent and fast way.
Runtime safety and No C++ Exception.

Simple Example

Reference Bind API / Unmarshal

#include "jsonserializer/json.h"
#include <string>
#include <vector>

const char* json_data = R"(
{
    "int" : 1,
    "object":{ "double" : 2.32},
    "string" : "hello world",
    "int_list":[1,2,3]
})";

// if every key you registered in the initializer_list exist and all types are matched,
// err will be false and value from json string will be set to you bind references appropriately.
int main(int argc,char**argv)
{
    int i; double d; 
    std::string s;
    std::vector<int> int_list;
    jsr::Json json;
    auto err = json.Parse(json_data);
    if(err) return 1;
    // register references in a initializer_list,pass-by-reference.
    err = json.Unmarshal({
        {"int",i},
        {"object",{
            {"double",d}}
        },
        {"string",s},
        {"int_list",int_list},
    });
    if(err) return 1;
}

Map Like API / Deserialize

...
const char* json_data = R"(
{
    "int" : 1,
    "object":{ "double" : 2.32},
    "string" : "hello world",
    "int_list":[1,2,3]
})";

int main(int argc,char**argv)
{
    jsr::Json json;
    auto err = json.Parse(json_data);
    if(err) return 1;
    auto dom = json.Deserialize();
    // All assignment are runtime safe,no exception even if the value not exist
    // return default value instead.
    int i = dom["int"];
    double d = dom["object"]["double"]; 
    std::string s = dom["string"];
    std::vector<int> int_list = dom["int_list"];

    // you could unmarshal again to check whether the value is exist and bind by reference.
    double dd;
    dom["object"].Unmarshal({
        {"double",dd}
    });
}

Value

Basic Type

This lib treats number,bool,double,string as basic type and they could be assigned to c++
data struct directly through Reference Bind API or Map Like API

const char * sample = R"({ "i" : 1 })";
...
jsr::Json json;
json.Parse(sample);

// Map Like API
auto d = json.Deserialize();
int i = d["i"];

// Reference Bind API
int j;
auto err = json.Unmarshal({{"i",j}});

Array With Basic Type

A json array holds basic type could be assigned to std::vector directly as well.

const char * sample = R"({ "s_list" : ["foo","bar"] })";
...
jsr::Json json;
json.Parse(sample);

// Map Like API
auto d = json.Deserialize();
std::vector<std::string> s_list = d["s_list"];

// Reference Bind API
std::vector<std::string> rs_list;
auto err = json.Unmarshal({{"s_list",rs_list}});

Array With Multi Type

A json array could holds values of diffierent types and it is much tricky.You could use jsr::Array
to resolve it.It is runtime safety class and easy to use.

const char * sample = R"({ "s_list" : [1,"foo",false,{"foo":"bar"}] })";
...
jsr::Json json;
json.Parse(sample);

// Map Like API
auto d = json.Deserialize();
jsr::Array array = d["s_list"];
int i = array[0];
std::string s = array[1];
bool b = array[2];
double d = array[3]; // also safe,return 0.0 

// Reference Bind API
jsr::Array rarray;
auto err = json.Unmarshal({
    {"s_list",rarray}
});
int ri = rarray[0];
std::string rs = rarray[1];
bool rb = rarray[2];

// you could Unmarshal to a binded reference through initializer_list too.
std::string foo;
auto err = rarray[3].Unmarshal({{"foo",foo}});

Object Type

A json object could holds multi objects with diffierent types.You could assigment them
through Reference Bind API or Map Like API

const char * sample = R"({"i":1,"s":"string","d":3.31})";
struct Foo{
    int i;
    std::string s;
    double d;
};
jsr::Json json;
json.Parse(sample);

// Map Like API
auto d = json.Deserialize();
Foo foo;
foo.i = d["i"];
foo.s = d["s"];
foo.d = d["d"];

// Reference Bind API
Foo foo2;
auto err = json.Unmarshal({
    {"i",foo2.i},
    {"s",foo2.s},
    {"d",foo2.d},
});
if (err) return 1;

API Rule

Deserialize

jsr::Json::Deserialize returns a jsr::Document object.
You could fetch value and assign to C++ data struct from any json string through string literal using operator[].

... 
auto d = json.Deserailize();
std::string s = d["string"];
int i = d["score"];
...

This API provides runtime safety assgment thats means every assigment will be successful
certainly and no Exception will be raised even a key you use to fetch value from a jsr::Document object
already parsed json string is not exists.

Marshal

jsr::Json::Marshal requires a initializer_list (jsr::Object container) to
resolve json string and bind value from json string to C++ data sturct.

... 
std::string s;
int i;
auto err = json.Unmarshal({
    {"i",i},
    {"s",s},
});
...

This API has a very strict map rule to resolve json string.
Every keys you indicates from a initializer_list must exist from
json string you parse and the types are all matched from both json string and C++ data struct.

const char* sample = R"({"foo":"bar"})";
...
jsr::Json json;
auto err = json.Parse(sample);

int i;
std::string s;
auto err = json.Unmarshal({{"bar",i}}); // err == true,'bar' not exist in sample.
err = json.Unmarshal({{"foo",i}}); // err == true,foo.bar from sample is a string,not a int.
err = json.Unmarshal({{"foo",s}}); // err == false,ok! "bar" is assigment to s successfully.

Nested Object

Nested Object is supported.Just make sures the object level is matched from
both json string and jsr container( jsr::Document or jsr::Object)

Third Party

rapidjson

Thanks to https://github.com/Tencent/rapidjson. rapidjson as internal json parse library which is SUPER fast.
This lib is also pass-by-reference in most conditions to reduce construction.

This lib doesn't use git submodule to maintaince rapidjson dependency due to poor network
from China To GitHub Server.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.