mirror of
				https://github.com/pocoproject/poco.git
				synced 2025-10-25 18:22:59 +02:00 
			
		
		
		
	GH #482: Poco::JSON::Stringifier::stringify bad behaviour
This commit is contained in:
		| @@ -73,11 +73,18 @@ void Stringifier::formatString(const std::string& value, std::ostream& out) | |||||||
| 	for (std::string::const_iterator it = value.begin(), | 	for (std::string::const_iterator it = value.begin(), | ||||||
| 		 end = value.end(); it != end; ++it) | 		 end = value.end(); it != end; ++it) | ||||||
| 	{ | 	{ | ||||||
| 		if (*it <= 0x1F || *it == '"' || *it == '\\' || *it == '/') | 		switch (*it) | ||||||
| 		{ | 		{ | ||||||
| 			out << '\\'; | 			case '\\': out << "\\\\"; break; | ||||||
|  | 			case '"': out << "\\\""; break; | ||||||
|  | 			case '/': out << "\\/"; break; | ||||||
|  | 			case '\b': out << "\\b"; break; | ||||||
|  | 			case '\f': out << "\\f"; break; | ||||||
|  | 			case '\n': out << "\\n"; break; | ||||||
|  | 			case '\r': out << "\\r"; break; | ||||||
|  | 			case '\t': out << "\\t"; break; | ||||||
|  | 			default: out << *it; break; | ||||||
| 		} | 		} | ||||||
| 		out << *it; |  | ||||||
| 	} | 	} | ||||||
| 	out << '"'; | 	out << '"'; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1223,15 +1223,32 @@ void JSONTest::testPrintHandler() | |||||||
|  |  | ||||||
| void JSONTest::testStringify() | void JSONTest::testStringify() | ||||||
| { | { | ||||||
|  | 	std::string str1 = "\r"; | ||||||
|  | 	std::string str2 = "\n"; | ||||||
|  | 	Poco::JSON::Object obj1, obj2; | ||||||
|  | 	obj1.set("payload", str1); | ||||||
|  | 	obj2.set("payload", str2); | ||||||
|  | 	std::ostringstream oss1, oss2; | ||||||
|  | 	Poco::JSON::Stringifier::stringify(obj1, oss1); | ||||||
|  | 	Poco::JSON::Stringifier::stringify(obj2, oss2); | ||||||
|  | 	assert(oss1.str() == "{\"payload\":\"\\\r\"}"); | ||||||
|  | 	std::cout << "\"" << oss1.str() << "\"" << std::endl; | ||||||
|  | 	assert(oss2.str() == "{\"payload\":\"\\\n\"}"); | ||||||
|  |  | ||||||
| 	Object jObj(false); | 	Object jObj(false); | ||||||
| 	jObj.set("foo\\", 0); | 	jObj.set("foo\\", 0); | ||||||
| 	jObj.set("bar/", 0); | 	jObj.set("bar/", 0); | ||||||
| 	jObj.set("baz", 0); | 	jObj.set("baz", 0); | ||||||
| 	jObj.set("q\"uote\"d", 0); | 	jObj.set("q\"uote\"d", 0); | ||||||
|  | 	jObj.set("backspace", "bs\b"); | ||||||
|  | 	jObj.set("newline", "nl\n"); | ||||||
|  | 	jObj.set("tab", "tb\t"); | ||||||
|  |  | ||||||
| 	std::stringstream ss; | 	std::stringstream ss; | ||||||
| 	jObj.stringify(ss); | 	jObj.stringify(ss); | ||||||
|  |  | ||||||
| 	assert(ss.str() == "{\"bar\\/\":0,\"baz\":0,\"foo\\\\\":0,\"q\\\"uote\\\"d\":0}"); | 	assert(ss.str() == "{\"backspace\":\"bs\\\b\",\"bar\\/\":0,\"baz\":0,\"foo\\\\\":0," | ||||||
|  | 		"\"newline\":\"nl\\\n\",\"q\\\"uote\\\"d\":0,\"tab\":\"tb\\\t\"}"); | ||||||
|  |  | ||||||
| 	std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, " | 	std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, " | ||||||
| 						"\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], " | 						"\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], " | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alex Fabijanic
					Alex Fabijanic