fixed GH #2364: Stringify escapes every unicode symbol when object contain an array

This commit is contained in:
Günter Obiltschnig 2019-06-22 14:27:31 +02:00
parent 1f65d15ac5
commit f581d8a256
3 changed files with 20 additions and 17 deletions

View File

@ -216,7 +216,7 @@ private:
inline void Array::setEscapeUnicode(bool escape) inline void Array::setEscapeUnicode(bool escape)
{ {
_escapeUnicode = true; _escapeUnicode = escape;
} }

View File

@ -296,7 +296,7 @@ private:
inline void Object::setEscapeUnicode(bool escape) inline void Object::setEscapeUnicode(bool escape)
{ {
_escapeUnicode = true; _escapeUnicode = escape;
} }

View File

@ -1938,26 +1938,29 @@ void JSONTest::testEscape0()
void JSONTest::testNonEscapeUnicode() void JSONTest::testNonEscapeUnicode()
{ {
std::string chinese("{ \"name\" : \"\\u4e2d\" }"); std::string chinese("{\"arr\":[{ \"name\" : \"\\u4e2d\" }]}");
Poco::JSON::Parser parser(new Poco::JSON::ParseHandler()); Poco::JSON::Parser parser(new Poco::JSON::ParseHandler());
Var result = parser.parse(chinese); Var result = parser.parse(chinese);
assert(result.type() == typeid(Object::Ptr)); assert(result.type() == typeid(Object::Ptr));
Object::Ptr object = result.extract<Object::Ptr>(); Object::Ptr object = result.extract<Object::Ptr>();
object->setEscapeUnicode(false);
std::stringstream ss; std::stringstream ss;
object->stringify(ss); object->stringify(ss);
assert(ss.str().compare("{\"name\":\"\xE4\xB8\xAD\"}") == 0); assert (ss.str().compare("{\"arr\":[{\"name\":\"\xE4\xB8\xAD\"}]}") == 0);
const unsigned char utf8Chars[] = {'{', '"', 'n', 'a', 'm', 'e', '"', ':', const unsigned char utf8Chars[] = {'{', '"', 'a', 'r', 'r', '"', ':', '[', '{', '"', 'n', 'a', 'm', 'e', '"', ':',
'"', 'g', 0xC3, 0xBC, 'n', 't', 'e', 'r', '"', '}', 0}; '"', 'g', 0xC3, 0xBC, 'n', 't', 'e', 'r', '"', '}', ']', '}', 0};
std::string utf8Text((const char*) utf8Chars); std::string utf8Text((const char*) utf8Chars);
parser.reset(); parser.reset();
result = parser.parse(utf8Text); result = parser.parse(utf8Text);
object = result.extract<Object::Ptr>(); object = result.extract<Object::Ptr>();
object->setEscapeUnicode(false);
ss.str(""); object->stringify(ss); ss.str(""); object->stringify(ss);
assert (ss.str() == "{\"name\":\"g\xC3\xBCnter\"}"); assert (ss.str() == "{\"arr\":[{\"name\":\"g\xC3\xBCnter\"}]}");
Poco::JSON::Object obj1; Poco::JSON::Object obj1;
std::string shortEscapeStr("String with \t"); std::string shortEscapeStr("String with \t");