|  | @@ -224,6 +224,31 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |              return !first;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Camel-case converter with added strictness for field mask formatting.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <exception cref="InvalidOperationException">The field mask is invalid for JSON representation</exception>
 | 
	
		
			
				|  |  | +        private static string ToCamelCaseForFieldMask(string input)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            for (int i = 0; i < input.Length; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                char c = input[i];
 | 
	
		
			
				|  |  | +                if (c >= 'A' && c <= 'Z')
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    throw new InvalidOperationException($"Invalid field mask to be converted to JSON: {input}");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (c == '_' && i < input.Length - 1)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    char next = input[i + 1];
 | 
	
		
			
				|  |  | +                    if (next < 'a' || next > 'z')
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        throw new InvalidOperationException($"Invalid field mask to be converted to JSON: {input}");
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return ToCamelCase(input);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // Converted from src/google/protobuf/util/internal/utility.cc ToCamelCase
 | 
	
		
			
				|  |  |          // TODO: Use the new field in FieldDescriptor.
 | 
	
		
			
				|  |  |          internal static string ToCamelCase(string input)
 | 
	
	
		
			
				|  | @@ -525,7 +550,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |          private void WriteFieldMask(StringBuilder builder, IMessage value)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              IList paths = (IList) value.Descriptor.Fields[FieldMask.PathsFieldNumber].Accessor.GetValue(value);
 | 
	
		
			
				|  |  | -            WriteString(builder, string.Join(",", paths.Cast<string>().Select(ToCamelCase)));
 | 
	
		
			
				|  |  | +            WriteString(builder, string.Join(",", paths.Cast<string>().Select(ToCamelCaseForFieldMask)));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private void WriteAny(StringBuilder builder, IMessage value)
 |