diff --git a/JsonParser/JsonToken.cpp b/JsonParser/JsonToken.cpp index 0d60dfcc..4a8c1632 100644 --- a/JsonParser/JsonToken.cpp +++ b/JsonParser/JsonToken.cpp @@ -7,6 +7,53 @@ using namespace ArduinoJson::Parser; +static char unescapeChar(char c) +{ + switch (c) + { + case 'b': return '\b'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + default: return c; + } +} + +static void unescapeString(char* s) +{ + char* readPtr = s; + char* writePtr = s; + + while (true) + { + if (*readPtr == '\\') + { + readPtr++; + *writePtr = unescapeChar(*readPtr); + } + else + { + *writePtr = *readPtr; + } + + if (*writePtr == 0) break; + + readPtr++; + writePtr++; + } +} + +char* JsonToken::getText() +{ + char* s = json + token->start; + json[token->end] = 0; + + unescapeString(s); + + return s; +} + JsonToken JsonToken::nextSibling() const { // start with current token diff --git a/JsonParser/JsonToken.h b/JsonParser/JsonToken.h index 2646541b..3d0686d9 100644 --- a/JsonParser/JsonToken.h +++ b/JsonParser/JsonToken.h @@ -29,11 +29,7 @@ namespace ArduinoJson } // Get content of the JSON token - char* getText() - { - json[token->end] = 0; - return json + token->start; - } + char* getText(); // Get the number of children tokens int childrenCount() diff --git a/JsonParserTests/JsonStringTests.cpp b/JsonParserTests/JsonStringTests.cpp index d19126ef..55df13a0 100644 --- a/JsonParserTests/JsonStringTests.cpp +++ b/JsonParserTests/JsonStringTests.cpp @@ -31,6 +31,12 @@ namespace ArduinoJsonParserTests outputMustBe(0); } + TEST_METHOD(SimpleString) + { + whenInputIs("\"Hi!\""); + outputMustBe("Hi!"); + } + TEST_METHOD(EscapedQuote) { whenInputIs("\"12\\\"34\""); // ie 12\"34 @@ -81,7 +87,7 @@ namespace ArduinoJsonParserTests TEST_METHOD(AllEscapedCharsTogether) { - whenInputIs("1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\""); + whenInputIs("\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\""); outputMustBe("1\"2\\3/4\b5\f6\n7\r8\t9"); }