Explorar o código

Add support for escape sequence `\'`

Fixes #2124
Benoit Blanchon hai 1 ano
pai
achega
f806a42cc2

+ 1 - 0
CHANGELOG.md

@@ -10,6 +10,7 @@ HEAD
 * Improve message when user forgets third arg of `serializeJson()` et al.
 * Set `ARDUINOJSON_USE_DOUBLE` to `0` by default on 8-bit architectures
 * Deprecate `containsKey()` in favor of `doc["key"].is<T>()`
+* Add support for escape sequence `\'` (issue #2124)
 
 | Architecture | before   | after    |
 |--------------|----------|----------|

+ 16 - 0
extras/tests/JsonDeserializer/string.cpp

@@ -83,6 +83,22 @@ TEST_CASE("Truncated JSON string") {
   }
 }
 
+TEST_CASE("Escape single quote in single quoted string") {
+  JsonDocument doc;
+
+  DeserializationError err = deserializeJson(doc, "'ab\\\'cd'");
+  REQUIRE(err == DeserializationError::Ok);
+  CHECK(doc.as<std::string>() == "ab\'cd");
+}
+
+TEST_CASE("Escape double quote in double quoted string") {
+  JsonDocument doc;
+
+  DeserializationError err = deserializeJson(doc, "'ab\\\"cd'");
+  REQUIRE(err == DeserializationError::Ok);
+  CHECK(doc.as<std::string>() == "ab\"cd");
+}
+
 TEST_CASE("Invalid JSON string") {
   const char* testCases[] = {"'\\u'",     "'\\u000g'", "'\\u000'",
                              "'\\u000G'", "'\\u000/'", "'\\x1234'"};

+ 4 - 0
extras/tests/JsonSerializer/JsonVariant.cpp

@@ -46,6 +46,10 @@ TEST_CASE("serializeJson(JsonVariant)") {
       check("fifty/fifty"_s, "\"fifty/fifty\"");
     }
 
+    SECTION("Don't escape single quote") {
+      check("hello'world"_s, "\"hello'world\"");
+    }
+
     SECTION("Escape backspace") {
       check("hello\bworld"_s, "\"hello\\bworld\"");
     }

+ 2 - 2
src/ArduinoJson/Json/EscapeSequence.hpp

@@ -32,8 +32,8 @@ class EscapeSequence {
   }
 
  private:
-  static const char* escapeTable(bool excludeSolidus) {
-    return &"//\"\"\\\\b\bf\fn\nr\rt\t"[excludeSolidus ? 2 : 0];
+  static const char* escapeTable(bool isSerializing) {
+    return &"//''\"\"\\\\b\bf\fn\nr\rt\t"[isSerializing ? 4 : 0];
   }
 };