To read and write JSON, this sample uses either DOM(MpObject) or the streaming interface. When using DOM(MpObject), it operates as described below:
#include "nn/nlib/msgpack/JsonStreamParser.h"
#include "nn/nlib/msgpack/JsonStreamGenerator.h"
using nlib_ns::msgpack::MpObject;
using nlib_ns::msgpack::JsonStreamParser;
using nlib_ns::msgpack::JsonStreamGenerator;
const char jsontext[] =
"{ \"item\": ["
"{\"itemCode\":91, \"itemName\" : \"ramen with salt based soup\", \"itemPrice\":300},"
"{\"itemCode\":94, \"itemName\" : \"ramen with miso based soup\", \"itemPrice\":290}, "
"{\"itemCode\":95, \"itemName\" : \"ramen with a pork bone broth\", \"itemPrice\":320} "
"] } ";
bool ReadModifyWriteJsonByDom() {
UniquePtr<MpObject> obj;
if (JsonStreamParser::Parse(obj, jsontext) != 0) return false;
MpObject* price;
int val;
MpObject* items = obj->GetMapItem("item");
if (!items) return false;
MpObject* salt = items->GetArrayItem(0);
if (!salt) return false;
price = salt->GetMapItem("itemPrice");
if (!price) return false;
val += 500;
MpObject* miso = items->GetArrayItem(1);
if (!miso) return false;
price = miso->GetMapItem("itemPrice");
if (!price) return false;
val += 500;
price->Box(val);
MpObject* pork = items->GetArrayItem(2);
if (!pork) return false;
price = pork->GetMapItem("itemPrice");
if (!price) return false;
val += 500;
*price = val;
char str[1024];
if (JsonStreamGenerator::Generate(NULL, str, *obj.get()) != 0) return false;
return true;
}
bool ReadAndWritePriceJsonByStreaming() {
JsonStreamParser parser;
MemoryInputStream istr(jsontext);
Nlist<int> prices;
JsonStreamParser::Event ev;
if ((ev = parser.Next()) != JsonStreamParser::EVENT_START_MAP) return false;
while ((ev = parser.Next()) != JsonStreamParser::EVENT_END_MAP) {
if (ev != JsonStreamParser::EVENT_KEY_NAME) return false;
if (strcmp(parser.GetToken().buf, "item") == 0) {
if ((ev = parser.Next()) != JsonStreamParser::EVENT_START_ARRAY) return false;
while ((ev = parser.Next()) != JsonStreamParser::EVENT_END_ARRAY) {
if (ev != JsonStreamParser::EVENT_START_MAP) return false;
while ((ev = parser.Next()) != JsonStreamParser::EVENT_END_MAP) {
if (ev != JsonStreamParser::EVENT_KEY_NAME) return false;
if (strcmp(parser.GetToken().buf, "itemPrice") == 0) {
ev = parser.Next();
int num;
if (
nlib_is_error(JsonStreamParser::ToInt32(parser.GetToken(), &num)))
return false;
prices.push_back(num);
} else {
}
}
}
} else {
}
}
JsonStreamGenerator gen;
char str[1024];
MemoryOutputStream ostr(str);
size_t prices_size = prices.size();
gen.StartArray(prices_size);
for (size_t i = 0; i < prices_size; ++i) {
gen.Int32(prices[i]);
}
gen.EndArray();
gen.Close();
return true;
}
bool SampleMain(int, char**) {
return ReadModifyWriteJsonByDom() && ReadAndWritePriceJsonByStreaming();
}
NLIB_MAINFUNC