Code review fixes
diff --git a/csharp/protos/unittest_issues.proto b/csharp/protos/unittest_issues.proto
index f120516..6c9f763 100644
--- a/csharp/protos/unittest_issues.proto
+++ b/csharp/protos/unittest_issues.proto
@@ -119,7 +119,7 @@
 }
 
 message TestJsonName {
-  // json_name field options are not properly handled during deserialization
+  // Message for testing the effects for of the json_name option
   string name = 1;
   string description = 2 [json_name = "desc"];
   string guid = 3 [json_name = "exid"];
diff --git a/csharp/src/Google.Protobuf.Test/IssuesTest.cs b/csharp/src/Google.Protobuf.Test/IssuesTest.cs
index 5b432ed..a38d6b0 100644
--- a/csharp/src/Google.Protobuf.Test/IssuesTest.cs
+++ b/csharp/src/Google.Protobuf.Test/IssuesTest.cs
@@ -66,6 +66,7 @@
             var settings = new JsonParser.Settings(10, TypeRegistry.FromFiles(UnittestIssuesReflection.Descriptor));

             var parser = new JsonParser(settings);

 

+            // It is safe to use either original field name or explicitly specified json_name

             Assert.AreEqual(new TestJsonName { Name = "test", Description = "test2", Guid = "test3" },

                 parser.Parse<TestJsonName>("{ \"name\": \"test\", \"desc\": \"test2\", \"guid\": \"test3\" }"));

         }

diff --git a/csharp/src/Google.Protobuf/JsonFormatter.cs b/csharp/src/Google.Protobuf/JsonFormatter.cs
index 1b5349e..cbd9366 100644
--- a/csharp/src/Google.Protobuf/JsonFormatter.cs
+++ b/csharp/src/Google.Protobuf/JsonFormatter.cs
@@ -238,8 +238,7 @@
                     writer.Write(PropertySeparator);
                 }
 
-                WriteString(writer, string.IsNullOrEmpty(accessor.Descriptor.JsonName) ?
-                    ToCamelCase(accessor.Descriptor.Name) : accessor.Descriptor.JsonName);
+                WriteString(writer, accessor.Descriptor.JsonName);
                 writer.Write(NameValueSeparator);
                 WriteValue(writer, value);
 
diff --git a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
index 8cfdb77..6083f17 100644
--- a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
@@ -94,7 +94,7 @@
         /// <summary>
         /// The json_name option of the descriptor's target.
         /// </summary>
-        public string JsonName { get { return proto.JsonName; } }
+        public string JsonName { get { return proto.JsonName == "" ? JsonFormatter.ToCamelCase(proto.Name) : proto.JsonName; } }
 
         internal FieldDescriptorProto Proto { get { return proto; } }
 
diff --git a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
index 63f168c..f5a835e 100644
--- a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
@@ -102,10 +102,8 @@
             var map = new Dictionary<string, FieldDescriptor>();
             foreach (var field in fields)
             {
-                map[JsonFormatter.ToCamelCase(field.Name)] = field;
                 map[field.Name] = field;
-                if (!string.IsNullOrEmpty(field.JsonName))
-                    map[field.JsonName] = field;
+                map[field.JsonName] = field;
             }
             return new ReadOnlyDictionary<string, FieldDescriptor>(map);
         }