diff --git a/apitools/base/py/encoding.py b/apitools/base/py/encoding.py index 7eec985d..182f1666 100644 --- a/apitools/base/py/encoding.py +++ b/apitools/base/py/encoding.py @@ -230,8 +230,7 @@ def _GetField(message, field_path): def _SetField(dictblob, field_path, value): for field in field_path[:-1]: - dictblob[field] = {} - dictblob = dictblob[field] + dictblob = dictblob.setdefault(field, {}) dictblob[field_path[-1]] = value diff --git a/apitools/base/py/encoding_test.py b/apitools/base/py/encoding_test.py index d306aaed..3564ca04 100644 --- a/apitools/base/py/encoding_test.py +++ b/apitools/base/py/encoding_test.py @@ -203,9 +203,12 @@ def testNestedIncludeFields(self): self.assertEqual( '{"nested": {"nested": null}}', encoding.MessageToJson(msg, include_fields=['nested.nested'])) - self.assertEqual( - '{"nested": {"nested_list": []}}', - encoding.MessageToJson(msg, include_fields=['nested.nested_list'])) + # When clearing 'nested.nested_list', its sibling ('nested.nested') + # should remain unaffected. + self.assertIn( + encoding.MessageToJson(msg, include_fields=['nested.nested_list']), + ['{"nested": {"nested": {}, "nested_list": []}}', + '{"nested": {"nested_list": [], "nested": {}}}']) self.assertEqual( '{"nested": {"nested": {"additional_properties": []}}}', encoding.MessageToJson(