Skip to content

Commit

Permalink
fix: allow serialization/deserializationt of Inf/-Inf/NaN
Browse files Browse the repository at this point in the history
New rapidjson version does not allow Inf/-Inf/NaN by default as the
is not part of the JSON spec.

This change adds the flag to allow them and raise exception for
case where the json is invalid.
  • Loading branch information
sileht committed Sep 18, 2020
1 parent 3e910b6 commit 976c892
Show file tree
Hide file tree
Showing 20 changed files with 181 additions and 154 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ if (${PB_GENERATOR_SYSTEM})
endif()


set(CMAKE_CXX_FLAGS "-g -Wall -Wextra -fopenmp -O2 -fPIC -std=c++14 -DUSE_OPENCV -DUSE_LMDB")
set(CMAKE_CXX_FLAGS "-g -Wall -Wextra -fopenmp -O2 -fPIC -std=c++14 -DUSE_OPENCV -DUSE_LMDB -fdiagnostics-color=always")


if (USE_COMMAND_LINE)
if (NOT USE_CAFFE)
Expand Down
4 changes: 4 additions & 0 deletions src/apidata.cc
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,10 @@ namespace dd
{
add(cit->name.GetString(), cit->value.GetInt());
}
else
{
throw DataConversionException("conversion error: unknown type");
}
}
}

Expand Down
11 changes: 10 additions & 1 deletion src/apidata.h
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,9 @@ namespace dd
toJDoc(d);

/*rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
rapidjson::Writer<rapidjson::StringBuffer, rapidjson::UTF8<>,
rapidjson::UTF8<>, rapidjson::CrtAllocator,
rapidjson::kWriteNanAndInfFlag> writer(buffer);
d.Accept(writer);
std::string reststring = buffer.GetString();
std::cout << "to jdoc=" << reststring << std::endl;*/
Expand Down Expand Up @@ -466,12 +468,19 @@ namespace dd
{
(void)vcv;
// Not Implemented
throw DataConversionException(
"JSON conversion of std::vector<cv::Mat> is not supported");
}

void operator()(const std::vector<std::pair<int, int>> &vpi)
{
(void)vpi;
// Not Implemented
throw DataConversionException(
"JSON conversion of std::vector<std::pair<int,int>> is not "
"supported");
}

void operator()(const std::vector<APIData> &vad)
{
JVal jov(rapidjson::kObjectType);
Expand Down
37 changes: 24 additions & 13 deletions src/jsonapi.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "jsonapi.h"
#include "dd_config.h"
#include "githash.h"
#include <rapidjson/allocators.h>
#include <rapidjson/document.h>
#include <rapidjson/stringbuffer.h>
#include <rapidjson/reader.h>
Expand Down Expand Up @@ -341,16 +342,26 @@ namespace dd
std::string JsonAPI::jrender(const JDoc &jst) const
{
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jst.Accept(writer);
rapidjson::Writer<rapidjson::StringBuffer, rapidjson::UTF8<>,
rapidjson::UTF8<>, rapidjson::CrtAllocator,
rapidjson::kWriteNanAndInfFlag>
writer(buffer);
bool done = jst.Accept(writer);
if (!done)
throw DataConversionException("JSON rendering failed");
return buffer.GetString();
}

std::string JsonAPI::jrender(const JVal &jval) const
{
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jval.Accept(writer);
rapidjson::Writer<rapidjson::StringBuffer, rapidjson::UTF8<>,
rapidjson::UTF8<>, rapidjson::CrtAllocator,
rapidjson::kWriteNanAndInfFlag>
writer(buffer);
bool done = jval.Accept(writer);
if (!done)
throw DataConversionException("JSON rendering failed");
return buffer.GetString();
}

Expand All @@ -361,7 +372,7 @@ namespace dd
if (!jstr.empty())
{
rapidjson::Document d;
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -428,7 +439,7 @@ namespace dd
}

rapidjson::Document d;
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -1013,7 +1024,7 @@ namespace dd
rapidjson::Document d;
if (!jstr.empty())
{
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -1056,7 +1067,7 @@ namespace dd
JDoc JsonAPI::service_predict(const std::string &jstr)
{
rapidjson::Document d;
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -1187,7 +1198,7 @@ namespace dd
JDoc JsonAPI::service_train(const std::string &jstr)
{
rapidjson::Document d;
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -1290,7 +1301,7 @@ namespace dd
JDoc JsonAPI::service_train_status(const std::string &jstr)
{
rapidjson::Document d;
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -1422,7 +1433,7 @@ namespace dd
JDoc JsonAPI::service_train_delete(const std::string &jstr)
{
rapidjson::Document d;
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -1487,7 +1498,7 @@ namespace dd
const std::string &jstr)
{
rapidjson::Document d;
d.Parse(jstr.c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jstr.c_str());
if (d.HasParseError())
{
_logger->error("JSON parsing error on string: {}", jstr);
Expand Down Expand Up @@ -1620,7 +1631,7 @@ namespace dd
return 1;
}
rapidjson::Document d;
d.Parse(buffer.str().c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(buffer.str().c_str());
if (d.HasParseError())
{
return 1;
Expand Down
2 changes: 1 addition & 1 deletion src/mlmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ namespace dd
std::stringstream jbuf;
jbuf << is.rdbuf();
rapidjson::Document d;
d.Parse(jbuf.str().c_str());
d.Parse<rapidjson::kParseNanAndInfFlag>(jbuf.str().c_str());
if (d.HasParseError())
{
logger->error("config.json parsing error on string: {}", jbuf.str());
Expand Down
2 changes: 1 addition & 1 deletion tests/opencv_tensor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,4 @@ int main(int argc, char **argv)
cv::imshow("imgOpencv",Image);

*/
}
}
6 changes: 4 additions & 2 deletions tests/ut-caffe2api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -158,14 +158,16 @@ inline void create(JsonAPI &japi, const std::string &json)

inline void predict(JsonAPI &japi, JDoc &jd, const std::string &json)
{
jd.Parse(japi.jrender(japi.service_predict(json)).c_str());
jd.Parse<rapidjson::kParseNanAndInfFlag>(
japi.jrender(japi.service_predict(json)).c_str());
ASSERT_TRUE(!jd.HasParseError());
ASSERT_EQ(200, jd["status"]["code"]);
}

inline void train(JsonAPI &japi, JDoc &jd, const std::string &json)
{
jd.Parse(japi.jrender(japi.service_train(json)).c_str());
jd.Parse<rapidjson::kParseNanAndInfFlag>(
japi.jrender(japi.service_train(json)).c_str());
ASSERT_TRUE(!jd.HasParseError());
ASSERT_EQ(201, jd["status"]["code"].GetInt());
ASSERT_EQ("Created", jd["status"]["msg"]);
Expand Down
Loading

0 comments on commit 976c892

Please sign in to comment.