Merge pull request #30141 from Nikhi00718/Nikhi00718:fix-json-string-escaping

core(persistence): emit valid JSON string escapes
This commit is contained in:
Alexander Smorkalov
2026-10-05 14:56:22 +03:00
committed by GitHub
2 changed files with 28 additions and 4 deletions

View File

@@ -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;
}
}

View File

@@ -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(