Commit 1fc416be authored by Dave Protasowski's avatar Dave Protasowski

Allow the JsonFormat.Parser to ignore unknown fields

The default behaviour of throwing an exception remains
parent 4bc16578
...@@ -224,7 +224,7 @@ public class JsonFormat { ...@@ -224,7 +224,7 @@ public class JsonFormat {
* Creates a {@link Parser} with default configuration. * Creates a {@link Parser} with default configuration.
*/ */
public static Parser parser() { public static Parser parser() {
return new Parser(TypeRegistry.getEmptyTypeRegistry()); return new Parser(TypeRegistry.getEmptyTypeRegistry(), false);
} }
/** /**
...@@ -232,9 +232,11 @@ public class JsonFormat { ...@@ -232,9 +232,11 @@ public class JsonFormat {
*/ */
public static class Parser { public static class Parser {
private final TypeRegistry registry; private final TypeRegistry registry;
private final boolean ignoringUnknownFields;
private Parser(TypeRegistry registry) { private Parser(TypeRegistry registry, boolean ignoreUnknownFields) {
this.registry = registry; this.registry = registry;
this.ignoringUnknownFields = ignoreUnknownFields;
} }
/** /**
...@@ -247,7 +249,16 @@ public class JsonFormat { ...@@ -247,7 +249,16 @@ public class JsonFormat {
if (this.registry != TypeRegistry.getEmptyTypeRegistry()) { if (this.registry != TypeRegistry.getEmptyTypeRegistry()) {
throw new IllegalArgumentException("Only one registry is allowed."); throw new IllegalArgumentException("Only one registry is allowed.");
} }
return new Parser(registry); return new Parser(registry, this.ignoringUnknownFields);
}
/**
* Creates a new {@link Parser} configured to not throw an exception
* when an unknown field is encountered. The new Parser clones all other
* configurations from this Parser.
*/
public Parser ignoringUnknownFields() {
return new Parser(this.registry, true);
} }
/** /**
...@@ -259,7 +270,7 @@ public class JsonFormat { ...@@ -259,7 +270,7 @@ public class JsonFormat {
public void merge(String json, Message.Builder builder) throws InvalidProtocolBufferException { public void merge(String json, Message.Builder builder) throws InvalidProtocolBufferException {
// TODO(xiaofeng): Investigate the allocation overhead and optimize for // TODO(xiaofeng): Investigate the allocation overhead and optimize for
// mobile. // mobile.
new ParserImpl(registry).merge(json, builder); new ParserImpl(registry, ignoringUnknownFields).merge(json, builder);
} }
/** /**
...@@ -272,7 +283,7 @@ public class JsonFormat { ...@@ -272,7 +283,7 @@ public class JsonFormat {
public void merge(Reader json, Message.Builder builder) throws IOException { public void merge(Reader json, Message.Builder builder) throws IOException {
// TODO(xiaofeng): Investigate the allocation overhead and optimize for // TODO(xiaofeng): Investigate the allocation overhead and optimize for
// mobile. // mobile.
new ParserImpl(registry).merge(json, builder); new ParserImpl(registry, ignoringUnknownFields).merge(json, builder);
} }
} }
...@@ -1024,9 +1035,11 @@ public class JsonFormat { ...@@ -1024,9 +1035,11 @@ public class JsonFormat {
private static class ParserImpl { private static class ParserImpl {
private final TypeRegistry registry; private final TypeRegistry registry;
private final JsonParser jsonParser; private final JsonParser jsonParser;
private final boolean ignoringUnknownFields;
ParserImpl(TypeRegistry registry) { ParserImpl(TypeRegistry registry, boolean ignoreUnknownFields) {
this.registry = registry; this.registry = registry;
this.ignoringUnknownFields = ignoreUnknownFields;
this.jsonParser = new JsonParser(); this.jsonParser = new JsonParser();
} }
...@@ -1191,6 +1204,9 @@ public class JsonFormat { ...@@ -1191,6 +1204,9 @@ public class JsonFormat {
} }
FieldDescriptor field = fieldNameMap.get(entry.getKey()); FieldDescriptor field = fieldNameMap.get(entry.getKey());
if (field == null) { if (field == null) {
if (ignoringUnknownFields) {
continue;
}
throw new InvalidProtocolBufferException( throw new InvalidProtocolBufferException(
"Cannot find field: " "Cannot find field: "
+ entry.getKey() + entry.getKey()
......
...@@ -1030,6 +1030,22 @@ public class JsonFormatTest extends TestCase { ...@@ -1030,6 +1030,22 @@ public class JsonFormatTest extends TestCase {
} }
} }
public void testParserUnknownFields() throws Exception {
try {
TestAllTypes.Builder builder = TestAllTypes.newBuilder();
String json = "{\n" + " \"unknownField\": \"XXX\"\n" + "}";
JsonFormat.parser().merge(json, builder);
fail("Exception is expected.");
} catch (InvalidProtocolBufferException e) {
// Expected.
}
}
public void testParserIgnoringUnknownFields() throws Exception {
TestAllTypes.Builder builder = TestAllTypes.newBuilder();
String json = "{\n" + " \"unknownField\": \"XXX\"\n" + "}";
JsonFormat.parser().ignoringUnknownFields().merge(json, builder);
}
public void testCustomJsonName() throws Exception { public void testCustomJsonName() throws Exception {
TestCustomJsonName message = TestCustomJsonName.newBuilder().setValue(12345).build(); TestCustomJsonName message = TestCustomJsonName.newBuilder().setValue(12345).build();
assertEquals("{\n" + " \"@value\": 12345\n" + "}", JsonFormat.printer().print(message)); assertEquals("{\n" + " \"@value\": 12345\n" + "}", JsonFormat.printer().print(message));
......
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