Added support for parsing JSON null value.

These cause the field in question to be skipped.

Bug: 16550393
Change-Id: Id05104e89818ee773b8a91fdcc86e18061b9a82f
Tested: on Linux.
parent e848137d
...@@ -166,6 +166,7 @@ root_type Monster; ...@@ -166,6 +166,7 @@ root_type Monster;
<li>It accepts field names with and without quotes, like many JSON parsers already do. It outputs them without quotes as well, though can be made to output them using the <code>strict_json</code> flag.</li> <li>It accepts field names with and without quotes, like many JSON parsers already do. It outputs them without quotes as well, though can be made to output them using the <code>strict_json</code> flag.</li>
<li>If a field has an enum type, the parser will recognize symbolic enum values (with or without quotes) instead of numbers, e.g. <code>field: EnumVal</code>. If a field is of integral type, you can still use symbolic names, but values need to be prefixed with their type and need to be quoted, e.g. <code>field: "Enum.EnumVal"</code>. For enums representing flags, you may place multiple inside a string separated by spaces to OR them, e.g. <code>field: "EnumVal1 EnumVal2"</code> or <code>field: "Enum.EnumVal1 Enum.EnumVal2"</code>.</li> <li>If a field has an enum type, the parser will recognize symbolic enum values (with or without quotes) instead of numbers, e.g. <code>field: EnumVal</code>. If a field is of integral type, you can still use symbolic names, but values need to be prefixed with their type and need to be quoted, e.g. <code>field: "Enum.EnumVal"</code>. For enums representing flags, you may place multiple inside a string separated by spaces to OR them, e.g. <code>field: "EnumVal1 EnumVal2"</code> or <code>field: "Enum.EnumVal1 Enum.EnumVal2"</code>.</li>
<li>Similarly, for unions, these need to specified with two fields much like you do when serializing from code. E.g. for a field <code>foo</code>, you must add a field <code>foo_type: FooOne</code> right before the <code>foo</code> field, where <code>FooOne</code> would be the table out of the union you want to use.</li> <li>Similarly, for unions, these need to specified with two fields much like you do when serializing from code. E.g. for a field <code>foo</code>, you must add a field <code>foo_type: FooOne</code> right before the <code>foo</code> field, where <code>FooOne</code> would be the table out of the union you want to use.</li>
<li>A field that has the value <code>null</code> (e.g. <code>field: null</code>) is intended to have the default value for that field (thus has the same effect as if that field wasn't specified at all).</li>
</ul> </ul>
<p>When parsing JSON, it recognizes the following escape codes in strings:</p> <p>When parsing JSON, it recognizes the following escape codes in strings:</p>
<ul> <ul>
......
...@@ -313,6 +313,9 @@ JSON: ...@@ -313,6 +313,9 @@ JSON:
you do when serializing from code. E.g. for a field `foo`, you must you do when serializing from code. E.g. for a field `foo`, you must
add a field `foo_type: FooOne` right before the `foo` field, where add a field `foo_type: FooOne` right before the `foo` field, where
`FooOne` would be the table out of the union you want to use. `FooOne` would be the table out of the union you want to use.
- A field that has the value `null` (e.g. `field: null`) is intended to
have the default value for that field (thus has the same effect as if
that field wasn't specified at all).
When parsing JSON, it recognizes the following escape codes in strings: When parsing JSON, it recognizes the following escape codes in strings:
......
...@@ -151,7 +151,8 @@ std::string Namespace::GetFullyQualifiedName(const std::string &name, ...@@ -151,7 +151,8 @@ std::string Namespace::GetFullyQualifiedName(const std::string &name,
TD(FileIdentifier, 267, "file_identifier") \ TD(FileIdentifier, 267, "file_identifier") \
TD(FileExtension, 268, "file_extension") \ TD(FileExtension, 268, "file_extension") \
TD(Include, 269, "include") \ TD(Include, 269, "include") \
TD(Attribute, 270, "attribute") TD(Attribute, 270, "attribute") \
TD(Null, 271, "null")
#ifdef __GNUC__ #ifdef __GNUC__
__extension__ // Stop GCC complaining about trailing comma with -Wpendantic. __extension__ // Stop GCC complaining about trailing comma with -Wpendantic.
#endif #endif
...@@ -343,6 +344,10 @@ CheckedError Parser::Next() { ...@@ -343,6 +344,10 @@ CheckedError Parser::Next() {
token_ = kTokenFileExtension; token_ = kTokenFileExtension;
return NoError(); return NoError();
} }
if (attribute_ == "null") {
token_ = kTokenNull;
return NoError();
}
// If not, it is a user-defined identifier: // If not, it is a user-defined identifier:
token_ = kTokenIdentifier; token_ = kTokenIdentifier;
return NoError(); return NoError();
...@@ -688,6 +693,9 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value, ...@@ -688,6 +693,9 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value,
} }
} else { } else {
EXPECT(':'); EXPECT(':');
if (Is(kTokenNull)) {
NEXT(); // Ignore this field.
} else {
Value val = field->value; Value val = field->value;
ECHECK(ParseAnyValue(val, field, fieldn)); ECHECK(ParseAnyValue(val, field, fieldn));
size_t i = field_stack_.size(); size_t i = field_stack_.size();
...@@ -702,6 +710,7 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value, ...@@ -702,6 +710,7 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value,
field_stack_.insert(field_stack_.begin() + i, std::make_pair(val, field)); field_stack_.insert(field_stack_.begin() + i, std::make_pair(val, field));
fieldn++; fieldn++;
} }
}
if (Is('}')) { NEXT(); break; } if (Is('}')) { NEXT(); break; }
EXPECT(','); EXPECT(',');
} }
......
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
], ],
test_type: Monster, test_type: Monster,
test: { test: {
name: "Fred" name: "Fred",
pos: null
}, },
test4: [ test4: [
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment