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]