allowSingleQuotes
issue #182
diff --git a/include/json/reader.h b/include/json/reader.h
index b59e183..154acbd 100644
--- a/include/json/reader.h
+++ b/include/json/reader.h
@@ -310,6 +310,8 @@
- true if dropped null placeholders are allowed. (See StreamWriterBuilder.)
- `"allowNumericKeys": false or true`
- true if numeric object keys are allowed.
+ - `"allowSingleQuotes": false or true`
+ - true if '' are allowed for strings (both keys and values)
- `"stackLimit": integer`
- Exceeding stackLimit (recursive depth of `readValue()`) will
cause an exception.
diff --git a/src/lib_json/json_reader.cpp b/src/lib_json/json_reader.cpp
index 8bbaeab..372b832 100644
--- a/src/lib_json/json_reader.cpp
+++ b/src/lib_json/json_reader.cpp
@@ -909,12 +909,12 @@
class OurFeatures {
public:
static OurFeatures all();
- static OurFeatures strictMode();
OurFeatures();
bool allowComments_;
bool strictRoot_;
bool allowDroppedNullPlaceholders_;
bool allowNumericKeys_;
+ bool allowSingleQuotes_;
bool failIfExtra_;
int stackLimit_;
}; // OurFeatures
@@ -923,20 +923,15 @@
// ////////////////////////////////
OurFeatures::OurFeatures()
- : allowComments_(true), strictRoot_(false),
- allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) {}
+ : allowComments_(true), strictRoot_(false)
+ , allowDroppedNullPlaceholders_(false), allowNumericKeys_(false)
+ , allowSingleQuotes_(false)
+ , failIfExtra_(false)
+{
+}
OurFeatures OurFeatures::all() { return OurFeatures(); }
-OurFeatures OurFeatures::strictMode() {
- OurFeatures features;
- features.allowComments_ = false;
- features.strictRoot_ = true;
- features.allowDroppedNullPlaceholders_ = false;
- features.allowNumericKeys_ = false;
- return features;
-}
-
// Implementation of class Reader
// ////////////////////////////////
@@ -1006,6 +1001,7 @@
bool readCStyleComment();
bool readCppStyleComment();
bool readString();
+ bool readStringSingleQuote();
void readNumber();
bool readValue();
bool readObject(Token& token);
@@ -1220,6 +1216,12 @@
token.type_ = tokenString;
ok = readString();
break;
+ case '\'':
+ if (features_.allowSingleQuotes_) {
+ token.type_ = tokenString;
+ ok = readStringSingleQuote();
+ break;
+ } // else continue
case '/':
token.type_ = tokenComment;
ok = readComment();
@@ -1371,7 +1373,6 @@
c = (current_ = p) < end_ ? *p++ : 0;
}
}
-
bool OurReader::readString() {
Char c = 0;
while (current_ != end_) {
@@ -1384,6 +1385,19 @@
return c == '"';
}
+
+bool OurReader::readStringSingleQuote() {
+ Char c = 0;
+ while (current_ != end_) {
+ c = getNextChar();
+ if (c == '\\')
+ getNextChar();
+ else if (c == '\'')
+ break;
+ }
+ return c == '\'';
+}
+
bool OurReader::readObject(Token& tokenStart) {
Token tokenName;
std::string name;
@@ -1878,6 +1892,7 @@
features.strictRoot_ = settings_["strictRoot"].asBool();
features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool();
features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool();
+ features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool();
features.stackLimit_ = settings_["stackLimit"].asInt();
features.failIfExtra_ = settings_["failIfExtra"].asBool();
return new OurCharReader(collectComments, features);
@@ -1890,6 +1905,7 @@
valid_keys->insert("strictRoot");
valid_keys->insert("allowDroppedNullPlaceholders");
valid_keys->insert("allowNumericKeys");
+ valid_keys->insert("allowSingleQuotes");
valid_keys->insert("stackLimit");
valid_keys->insert("failIfExtra");
}
@@ -1919,6 +1935,7 @@
(*settings)["strictRoot"] = true;
(*settings)["allowDroppedNullPlaceholders"] = false;
(*settings)["allowNumericKeys"] = false;
+ (*settings)["allowSingleQuotes"] = false;
(*settings)["failIfExtra"] = true;
//! [CharReaderBuilderStrictMode]
}
@@ -1931,6 +1948,7 @@
(*settings)["strictRoot"] = false;
(*settings)["allowDroppedNullPlaceholders"] = false;
(*settings)["allowNumericKeys"] = false;
+ (*settings)["allowSingleQuotes"] = false;
(*settings)["stackLimit"] = 1000;
(*settings)["failIfExtra"] = false;
//! [CharReaderBuilderDefaults]