mirror of
https://github.com/opencv/opencv.git
synced 2026-11-14 21:40:06 -06:00
Merge pull request #30141 from Nikhi00718/Nikhi00718:fix-json-string-escaping
core(persistence): emit valid JSON string escapes
This commit is contained in:
@@ -95,7 +95,7 @@ public:
|
||||
|
||||
void write(const char* key, const char* str, bool quote)
|
||||
{
|
||||
char buf[CV_FS_MAX_LEN*4+16];
|
||||
char buf[CV_FS_MAX_LEN*6+16];
|
||||
char* data = (char*)str;
|
||||
int i, len;
|
||||
|
||||
@@ -114,18 +114,27 @@ public:
|
||||
for( i = 0; i < len; i++ )
|
||||
{
|
||||
char c = str[i];
|
||||
const unsigned char byte = static_cast<unsigned char>(c);
|
||||
|
||||
switch ( c )
|
||||
{
|
||||
case '\\':
|
||||
case '\"':
|
||||
case '\'': { *data++ = '\\'; *data++ = c; break; }
|
||||
case '\"': { *data++ = '\\'; *data++ = c; break; }
|
||||
case '\n': { *data++ = '\\'; *data++ = 'n'; break; }
|
||||
case '\r': { *data++ = '\\'; *data++ = 'r'; break; }
|
||||
case '\t': { *data++ = '\\'; *data++ = 't'; break; }
|
||||
case '\b': { *data++ = '\\'; *data++ = 'b'; break; }
|
||||
case '\f': { *data++ = '\\'; *data++ = 'f'; break; }
|
||||
default : { *data++ = c; }
|
||||
default :
|
||||
if (byte < 0x20)
|
||||
{
|
||||
static const char hex[] = "0123456789abcdef";
|
||||
*data++ = '\\'; *data++ = 'u'; *data++ = '0'; *data++ = '0';
|
||||
*data++ = hex[byte >> 4]; *data++ = hex[byte & 0xf];
|
||||
}
|
||||
else
|
||||
*data++ = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1082,6 +1082,21 @@ TEST(Core_InputOutput, filestorage_json_comment)
|
||||
EXPECT_EQ(str, String("value"));
|
||||
}
|
||||
|
||||
TEST(Core_InputOutput, filestorage_json_escape_string)
|
||||
{
|
||||
const String value = "O'Reilly\x01";
|
||||
FileStorage writer("test.json", FileStorage::WRITE | FileStorage::MEMORY);
|
||||
writer << "text" << value;
|
||||
const String json = writer.releaseAndGetString();
|
||||
|
||||
EXPECT_NE(String::npos, json.find("\"text\": \"O'Reilly\\u0001\""));
|
||||
|
||||
FileStorage reader(json, FileStorage::READ | FileStorage::MEMORY);
|
||||
String restored;
|
||||
reader["text"] >> restored;
|
||||
EXPECT_EQ(value, restored);
|
||||
}
|
||||
|
||||
TEST(Core_InputOutput, filestorage_utf8_bom)
|
||||
{
|
||||
EXPECT_NO_THROW(
|
||||
|
||||
Reference in New Issue
Block a user