|  | @@ -224,7 +224,7 @@ public class JsonFormat {
 | 
	
		
			
				|  |  |     * Creates a {@link Parser} with default configuration.
 | 
	
		
			
				|  |  |     */
 | 
	
		
			
				|  |  |    public static Parser parser() {
 | 
	
		
			
				|  |  | -    return new Parser(TypeRegistry.getEmptyTypeRegistry());
 | 
	
		
			
				|  |  | +    return new Parser(TypeRegistry.getEmptyTypeRegistry(), false);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /**
 | 
	
	
		
			
				|  | @@ -232,9 +232,11 @@ public class JsonFormat {
 | 
	
		
			
				|  |  |     */
 | 
	
		
			
				|  |  |    public static class Parser {
 | 
	
		
			
				|  |  |      private final TypeRegistry registry;
 | 
	
		
			
				|  |  | +    private final boolean ignoringUnknownFields;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private Parser(TypeRegistry registry) {
 | 
	
		
			
				|  |  | +    private Parser(TypeRegistry registry, boolean ignoreUnknownFields) {
 | 
	
		
			
				|  |  |        this.registry = registry;
 | 
	
		
			
				|  |  | +      this.ignoringUnknownFields = ignoreUnknownFields;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -247,7 +249,16 @@ public class JsonFormat {
 | 
	
		
			
				|  |  |        if (this.registry != TypeRegistry.getEmptyTypeRegistry()) {
 | 
	
		
			
				|  |  |          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 {
 | 
	
		
			
				|  |  |      public void merge(String json, Message.Builder builder) throws InvalidProtocolBufferException {
 | 
	
		
			
				|  |  |        // TODO(xiaofeng): Investigate the allocation overhead and optimize for
 | 
	
		
			
				|  |  |        // mobile.
 | 
	
		
			
				|  |  | -      new ParserImpl(registry).merge(json, builder);
 | 
	
		
			
				|  |  | +      new ParserImpl(registry, ignoringUnknownFields).merge(json, builder);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -272,7 +283,7 @@ public class JsonFormat {
 | 
	
		
			
				|  |  |      public void merge(Reader json, Message.Builder builder) throws IOException {
 | 
	
		
			
				|  |  |        // TODO(xiaofeng): Investigate the allocation overhead and optimize for
 | 
	
		
			
				|  |  |        // mobile.
 | 
	
		
			
				|  |  | -      new ParserImpl(registry).merge(json, builder);
 | 
	
		
			
				|  |  | +      new ParserImpl(registry, ignoringUnknownFields).merge(json, builder);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1024,9 +1035,11 @@ public class JsonFormat {
 | 
	
		
			
				|  |  |    private static class ParserImpl {
 | 
	
		
			
				|  |  |      private final TypeRegistry registry;
 | 
	
		
			
				|  |  |      private final JsonParser jsonParser;
 | 
	
		
			
				|  |  | +    private final boolean ignoringUnknownFields;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    ParserImpl(TypeRegistry registry) {
 | 
	
		
			
				|  |  | +    ParserImpl(TypeRegistry registry, boolean ignoreUnknownFields) {
 | 
	
		
			
				|  |  |        this.registry = registry;
 | 
	
		
			
				|  |  | +      this.ignoringUnknownFields = ignoreUnknownFields;
 | 
	
		
			
				|  |  |        this.jsonParser = new JsonParser();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1191,6 +1204,9 @@ public class JsonFormat {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          FieldDescriptor field = fieldNameMap.get(entry.getKey());
 | 
	
		
			
				|  |  |          if (field == null) {
 | 
	
		
			
				|  |  | +          if (ignoringUnknownFields) {
 | 
	
		
			
				|  |  | +            continue;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |            throw new InvalidProtocolBufferException(
 | 
	
		
			
				|  |  |                "Cannot find field: "
 | 
	
		
			
				|  |  |                    + entry.getKey()
 |