diff --git a/apitools/base/py/encoding_helper.py b/apitools/base/py/encoding_helper.py index 2d8a449..96e3ebd 100644 --- a/apitools/base/py/encoding_helper.py +++ b/apitools/base/py/encoding_helper.py @@ -691,7 +691,7 @@ def _EncodeCustomFieldNames(message, encoded_value): if field_remappings: decoded_value = json.loads(encoded_value) for python_name, json_name in field_remappings: - if python_name in encoded_value: + if python_name in decoded_value: decoded_value[json_name] = decoded_value.pop(python_name) encoded_value = json.dumps(decoded_value) return encoded_value diff --git a/apitools/base/py/encoding_test.py b/apitools/base/py/encoding_test.py index a681670..2c21a50 100644 --- a/apitools/base/py/encoding_test.py +++ b/apitools/base/py/encoding_test.py @@ -205,6 +205,7 @@ class SomeEnum(messages.Enum): another_field = messages.StringField(3) repeated_enum = messages.EnumField(SomeEnum, 4, repeated=True) repeated_field = messages.StringField(5, repeated=True) + field = messages.StringField(6) class MessageWithPackageAndRemappings(messages.Message): @@ -236,6 +237,8 @@ class AdditionalProperty(messages.Message): 'another_field', 'anotherField') encoding.AddCustomJsonFieldMapping(MessageWithRemappings, 'repeated_field', 'repeatedField') +encoding.AddCustomJsonFieldMapping(MessageWithRemappings, + 'field', 'remappedField') class EncodingTest(unittest.TestCase): @@ -644,6 +647,19 @@ def testMultipleRemapping(self): self.assertEqual( msg, encoding.JsonToMessage(MessageWithRemappings, json_message)) + def testSubstringFieldRemapping(self): + # 'field' is a substring of 'another_field' and 'repeated_field', + # as well as a substring of the string value below. When 'field' is + # unset, encoding must not raise KeyError. + msg = MessageWithRemappings( + another_field='value containing field substring') + json_message = encoding.MessageToJson(msg) + self.assertEqual( + '{"anotherField": "value containing field substring"}', + json_message) + self.assertEqual( + msg, encoding.JsonToMessage(MessageWithRemappings, json_message)) + def testRepeatedRemapping(self): # Should allow remapping if the mapping remains the same. encoding.AddCustomJsonEnumMapping(MessageWithRemappings.SomeEnum,