summaryrefslogtreecommitdiff
path: root/db/json.cpp
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2009-01-29 18:58:47 -0500
committerAaron <aaron@10gen.com>2009-01-29 18:58:47 -0500
commit01f5ce5434f06f70ff51c5722d249489f516fb83 (patch)
treeb734e94a7a8330d8a6c3cefc4adf698edc38d8b8 /db/json.cpp
parent1211514a190a20bf733805f4eb54c5a52c5240d3 (diff)
downloadmongo-01f5ce5434f06f70ff51c5722d249489f516fb83.tar.gz
Allow unquoted field names, at Dwight's request
Diffstat (limited to 'db/json.cpp')
-rw-r--r--db/json.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/db/json.cpp b/db/json.cpp
index 50ab40ed391..219305d842b 100644
--- a/db/json.cpp
+++ b/db/json.cpp
@@ -198,6 +198,15 @@ namespace mongo {
ObjectBuilder &b;
};
+ struct unquotedFieldNameEnd {
+ unquotedFieldNameEnd( ObjectBuilder &_b ) : b( _b ) {}
+ void operator() ( const char *start, const char *end ) const {
+ string name( start, end );
+ b.fieldNames.back() = name;
+ }
+ ObjectBuilder &b;
+ };
+
struct stringEnd {
stringEnd( ObjectBuilder &_b ) : b( _b ) {}
void operator() ( const char *start, const char *end ) const {
@@ -407,7 +416,10 @@ public:
members = pair >> !( ',' >> members );
pair =
oid[ oidEnd( self.b ) ] |
- str[ fieldNameEnd( self.b ) ] >> ':' >> value;
+ fieldName >> ':' >> value;
+ fieldName =
+ str[ fieldNameEnd( self.b ) ] |
+ unquotedFieldName[ unquotedFieldNameEnd( self.b ) ];
array = ch_p( '[' )[ arrayStart( self.b ) ] >> !elements >> ']';
elements = value >> !( ch_p( ',' )[ arrayNext( self.b ) ] >> elements );
value =
@@ -439,6 +451,8 @@ public:
// real_p accepts numbers with nonsignificant zero prefixes, which
// aren't allowed in JSON. Oh well.
number = real_p[ numberValue( self.b ) ];
+
+ unquotedFieldName = lexeme_d[ ( alpha_p | ch_p( '$' ) ) >> *( ( alnum_p | ch_p( '$' ) | ch_p( '_' ) ) ) ];
dbref = dbrefS | dbrefT;
dbrefS = ch_p( '{' ) >> "\"$ns\"" >> ':' >>
@@ -481,7 +495,7 @@ public:
}
rule< ScannerT > object, members, pair, array, elements, value, str, number,
dbref, dbrefS, dbrefT, oid, oidS, oidT, bindata, date, dateS, dateT,
- regex, regexS, regexT, quotedOid;
+ regex, regexS, regexT, quotedOid, fieldName, unquotedFieldName;
const rule< ScannerT > &start() const {
return object;
}