|  | @@ -1130,13 +1130,23 @@ static const upb_handlers* msgdef_pb_serialize_handlers(Descriptor* desc) {
 | 
	
		
			
				|  |  |    return desc->pb_serialize_handlers;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static const upb_handlers* msgdef_json_serialize_handlers(Descriptor* desc) {
 | 
	
		
			
				|  |  | -  if (desc->json_serialize_handlers == NULL) {
 | 
	
		
			
				|  |  | -    desc->json_serialize_handlers =
 | 
	
		
			
				|  |  | -        upb_json_printer_newhandlers(
 | 
	
		
			
				|  |  | -            desc->msgdef, &desc->json_serialize_handlers);
 | 
	
		
			
				|  |  | +static const upb_handlers* msgdef_json_serialize_handlers(
 | 
	
		
			
				|  |  | +    Descriptor* desc, bool preserve_proto_fieldnames) {
 | 
	
		
			
				|  |  | +  if (preserve_proto_fieldnames) {
 | 
	
		
			
				|  |  | +    if (desc->json_serialize_handlers == NULL) {
 | 
	
		
			
				|  |  | +      desc->json_serialize_handlers =
 | 
	
		
			
				|  |  | +          upb_json_printer_newhandlers(
 | 
	
		
			
				|  |  | +              desc->msgdef, true, &desc->json_serialize_handlers);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return desc->json_serialize_handlers;
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    if (desc->json_serialize_handlers_preserve == NULL) {
 | 
	
		
			
				|  |  | +      desc->json_serialize_handlers_preserve =
 | 
	
		
			
				|  |  | +          upb_json_printer_newhandlers(
 | 
	
		
			
				|  |  | +              desc->msgdef, false, &desc->json_serialize_handlers_preserve);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return desc->json_serialize_handlers_preserve;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  return desc->json_serialize_handlers;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /*
 | 
	
	
		
			
				|  | @@ -1181,16 +1191,33 @@ VALUE Message_encode(VALUE klass, VALUE msg_rb) {
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * Encodes the given message object into its serialized JSON representation.
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -VALUE Message_encode_json(VALUE klass, VALUE msg_rb) {
 | 
	
		
			
				|  |  | +VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
 | 
	
		
			
				|  |  |    VALUE descriptor = rb_ivar_get(klass, descriptor_instancevar_interned);
 | 
	
		
			
				|  |  |    Descriptor* desc = ruby_to_Descriptor(descriptor);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +  VALUE msg_rb;
 | 
	
		
			
				|  |  | +  VALUE preserve_proto_fieldnames = Qfalse;
 | 
	
		
			
				|  |  |    stringsink sink;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (argc < 1 || argc > 2) {
 | 
	
		
			
				|  |  | +    rb_raise(rb_eArgError, "Expected 1 or 2 arguments.");
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  msg_rb = argv[0];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (argc == 2) {
 | 
	
		
			
				|  |  | +    VALUE hash_args = argv[1];
 | 
	
		
			
				|  |  | +    if (TYPE(hash_args) != T_HASH) {
 | 
	
		
			
				|  |  | +      rb_raise(rb_eArgError, "Expected hash arguments.");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    preserve_proto_fieldnames = rb_hash_lookup2(
 | 
	
		
			
				|  |  | +        hash_args, ID2SYM(rb_intern("preserve_proto_fieldnames")), Qfalse);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    stringsink_init(&sink);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  |      const upb_handlers* serialize_handlers =
 | 
	
		
			
				|  |  | -        msgdef_json_serialize_handlers(desc);
 | 
	
		
			
				|  |  | +        msgdef_json_serialize_handlers(desc, RTEST(preserve_proto_fieldnames));
 | 
	
		
			
				|  |  |      upb_json_printer* printer;
 | 
	
		
			
				|  |  |      stackenv se;
 | 
	
		
			
				|  |  |      VALUE ret;
 |