1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

JSON: Support escape special chars. (#1758) v4.0.182

This commit is contained in:
xmedia-systems 2021-10-20 08:57:40 +08:00 committed by winlin
parent 061d544195
commit 34b968aabf
4 changed files with 90 additions and 7 deletions

View file

@ -1538,17 +1538,31 @@ SrsJsonArray* SrsJsonAny::to_array()
return p;
}
string escape(string v)
// @see https://github.com/ossrs/srs/pull/1758/files#diff-9568479ef5cb0aa1ade2381e11e9c066c01bf9c4bbed70ffa27094d08bb27380R370
// @see https://github.com/json-parser/json-builder/blob/2d8c6671926d104c5dcd43ccd2b1431a3f0299e0/json-builder.c#L495
string json_serialize_string(const string& v)
{
stringstream ss;
for (int i = 0; i < (int)v.length(); i++) {
if (v.at(i) == '"') {
ss << '\\';
ss << "\"";
const char* start = v.data();
const char* end = start + v.length();
for (const char* p = start; p < end; ++p) {
switch (*p) {
case '"': ss << '\\' << '"'; break;
case '\\': ss << '\\' << '\\'; break;
case '\b': ss << '\\' << 'b'; break;
case '\f': ss << '\\' << 'f'; break;
case '\n': ss << '\\' << 'n'; break;
case '\r': ss << '\\' << 'r'; break;
case '\t': ss << '\\' << 't'; break;
default: ss << *p;
}
ss << v.at(i);
}
ss << "\"";
return ss.str();
}
@ -1556,7 +1570,9 @@ string SrsJsonAny::dumps()
{
switch (marker) {
case SRS_JSON_String: {
return "\"" + escape(to_str()) + "\"";
SrsJsonString* p = dynamic_cast<SrsJsonString*>(this);
srs_assert(p != NULL);
return json_serialize_string(p->value);
}
case SRS_JSON_Boolean: {
return to_boolean()? "true" : "false";