out.push_back(hexDigit((v >> 8) & 0x0f));
out.push_back(hexDigit((v >> 4) & 0x0f));
out.push_back(hexDigit(v & 0x0f));
- continue;
- }
- if (*p == '\\' || *p == '\"') {
+ } else if (*p == '\\' || *p == '\"') {
out.push_back('\\');
out.push_back(*p++);
- continue;
- }
- if (*p <= 0x1f) {
- // note that this if condition captures both control characters
- // and extended ascii characters
- out.append("\\u00");
- out.push_back(hexDigit((*p & 0xf0) >> 4));
- out.push_back(hexDigit(*p & 0xf));
- p++;
- continue;
+ } else if (*p <= 0x1f) {
+ switch (*p) {
+ case '\b': out.append("\\b"); p++; break;
+ case '\f': out.append("\\f"); p++; break;
+ case '\n': out.append("\\n"); p++; break;
+ case '\r': out.append("\\r"); p++; break;
+ case '\t': out.append("\\t"); p++; break;
+ default:
+ // note that this if condition captures both control characters
+ // and extended ascii characters
+ out.append("\\u00");
+ out.push_back(hexDigit((*p & 0xf0) >> 4));
+ out.push_back(hexDigit(*p & 0xf));
+ p++;
+ }
+ } else {
+ out.push_back(*p++);
}
- out.push_back(*p++);
}
out.push_back('\"');
EXPECT_TRUE(caught);
}
+TEST(Json, JsonEscape) {
+ folly::json::serialization_opts opts;
+ EXPECT_EQ(
+ folly::json::serialize("\b\f\n\r\x01\t\\\"/\v\a", opts),
+ R"("\b\f\n\r\u0001\t\\\"/\u000b\u0007")");
+}
+
TEST(Json, JsonNonAsciiEncoding) {
folly::json::serialization_opts opts;
opts.encode_non_ascii = true;