Browse Source

Allowed json_format.ParseDict to parse extensions with scalar types. (#5609)

Peter Sobot 6 years ago
parent
commit
50342e4812

+ 11 - 0
python/google/protobuf/internal/json_format_test.py

@@ -202,6 +202,17 @@ class JsonFormatTest(JsonFormatBase):
     json_format.ParseDict(message_dict, parsed_message)
     json_format.ParseDict(message_dict, parsed_message)
     self.assertEqual(message, parsed_message)
     self.assertEqual(message, parsed_message)
 
 
+  def testExtensionToDictAndBackWithScalar(self):
+    message = unittest_pb2.TestAllExtensions()
+    ext1 = unittest_pb2.TestNestedExtension.test
+    message.Extensions[ext1] = 'data'
+    message_dict = json_format.MessageToDict(
+        message
+    )
+    parsed_message = unittest_pb2.TestAllExtensions()
+    json_format.ParseDict(message_dict, parsed_message)
+    self.assertEqual(message, parsed_message)
+
   def testJsonParseDictToAnyDoesNotAlterInput(self):
   def testJsonParseDictToAnyDoesNotAlterInput(self):
     orig_dict = {
     orig_dict = {
         'int32Value': 20,
         'int32Value': 20,

+ 4 - 1
python/google/protobuf/json_format.py

@@ -564,7 +564,10 @@ class _Parser(object):
           sub_message.SetInParent()
           sub_message.SetInParent()
           self.ConvertMessage(value, sub_message)
           self.ConvertMessage(value, sub_message)
         else:
         else:
-          setattr(message, field.name, _ConvertScalarFieldValue(value, field))
+          if field.is_extension:
+            message.Extensions[field] = _ConvertScalarFieldValue(value, field)
+          else:
+            setattr(message, field.name, _ConvertScalarFieldValue(value, field))
       except ParseError as e:
       except ParseError as e:
         if field and field.containing_oneof is None:
         if field and field.containing_oneof is None:
           raise ParseError('Failed to parse {0} field: {1}'.format(name, e))
           raise ParseError('Failed to parse {0} field: {1}'.format(name, e))