| 
					
				 | 
			
			
				@@ -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() 
			 |