dropbox / json11

A tiny JSON library for C++11.
MIT License
2.55k stars 613 forks source link

How to create such JSON ? #49

Closed pengweichu closed 8 years ago

pengweichu commented 8 years ago

Hello, I'm new to json11, in previous I using the rapidjson, I want to create below JSONs with json11, must I build the whole JSON string first in order to assign to json11::Json? It's possible have some other ways to do that ?

1: {"transports":{"1":{"protocol":"TCP","port":5060}, "2":{"protocol":"UDP","port":5062}, "3":{"protocol":"TLS","port":5068}},

2: {" request ":" clear", "ids":[1, 2, 3]}

3: {"response":" GetAllocations ", "ports":[1, 9098, 9099, 2, 9100, 9101, 3, 9102, 9103], "code": 200"}

With rapidjson, I can do it likes below, does json11 supports similar way ?

writer.String("transports");

writer.StartObject();

int counter = 0;
TransportSet::iterator it = transports.begin();
for (; it != transports.end(); ++it)
{
    ++counter;
    char temp[32] = { 0 };
    itoa(counter, temp, 10);
    writer.String(temp);
    writer.StartObject();
    writer.String("protocol");
    writer.String(it->protocol.c_str());
    writer.String("port");
    writer.String(it->transportPort.c_str());
    writer.EndObject();
}

writer.EndObject();
artwyman commented 8 years ago

Json objects are intentionally immutable. If you want to build a Json object incrementally, just create a Json::object (which is a typedef for map<string,Json>), add the elements you want, then construct a Json() from the final result. You can use the same using Json::array which is std::vector. The implicit constructors for various Json values should make it pretty easy to set the individual values from numbers or strings. If you need nested objects, just repeat the process I describe here at each level.

pengweichu commented 8 years ago

Got it, thanks for your help, I will try it.

Best regards,

artwyman commented 8 years ago

I don't want to go deep debugging your code for you, but I don't see any sign that the library is behaving badly. The first difference I see is an extra array where there should, which looks like it maps to the Json::array ar in your code, so I wonder why you think you need that.

Good luck.

Andrew

On Tue, Jan 5, 2016 at 12:38 AM, pengweichu notifications@github.com wrote:

@artwyman https://github.com/artwyman I'm sorry, could you please help me to create below JSON ?

{"transports":{"1":{"protocol":"TCP","port":5060}, "2":{"protocol":"UDP","port":5062}, "3":{"protocol":"TLS","port":5068}}}

Below is my code, but the out put string is :

{"transports": {"1": [{"protocol": "udp"}, {"port": 5060}], "2": [{"protocol": "tcp"}, {"port": 5061}], "3": [{"protocol": "tls"}, {"port": 5062}]}}

std::vectorstd::string transports; transports.push_back("udp"); transports.push_back("tcp"); transports.push_back("tls");

std::vector ports; ports.push_back(5060); ports.push_back(5061); ports.push_back(5062);

std::map<string, Json> finalJson;

for (int i = 0; i < 3; ++i) { std::map<std::string, std::string> m1; m1["protocol"] = transports[i];

std::map<std::string, int> m2;
m2["port"] = ports[i];

Json::array ar;
ar.push_back(Json(m1));
ar.push_back(Json(m2));

if (i == 0)
{
    finalJson["1"] = Json(ar);
}
else if (i == 1)
{
    finalJson["2"] = Json(ar);
}
else if (i == 2)
{
    finalJson["3"] = Json(ar);
}

}

Json::object ob; ob["transports"] = Json(finalJson); Json testJson = ob;

std::string ttt = testJson.dump(); printf("%s\n", ttt.c_str());

— Reply to this email directly or view it on GitHub https://github.com/dropbox/json11/issues/49#issuecomment-168934936.

pengweichu commented 8 years ago

@artwyman Thanks, I have been got it solved. Sorry for bother.

Best regards,