From b01b1a8ebeb83689d606546d5867009d380cdecd Mon Sep 17 00:00:00 2001 From: Jie Luo Date: Tue, 17 May 2016 13:01:27 -0700 Subject: JSON format for Any message must print @type first, use OrderedDict instead of {} --- python/google/protobuf/internal/json_format_test.py | 16 ++++++++++++++++ python/google/protobuf/json_format.py | 7 ++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/python/google/protobuf/internal/json_format_test.py b/python/google/protobuf/internal/json_format_test.py index bdc9f49a..eec1f56f 100644 --- a/python/google/protobuf/internal/json_format_test.py +++ b/python/google/protobuf/internal/json_format_test.py @@ -458,6 +458,22 @@ class JsonFormatTest(JsonFormatBase): '}\n')) parsed_message = json_format_proto3_pb2.TestAny() self.CheckParseBack(message, parsed_message) + # Must print @type first + test_message = json_format_proto3_pb2.TestMessage( + bool_value=True, + int32_value=20, + int64_value=-20, + uint32_value=20, + uint64_value=20, + double_value=3.14, + string_value='foo') + message.Clear() + message.value.Pack(test_message) + self.assertEqual( + json_format.MessageToJson(message, False)[0:68], + '{\n' + ' "value": {\n' + ' "@type": "type.googleapis.com/proto3.TestMessage"') def testWellKnownInAnyMessage(self): message = any_pb2.Any() diff --git a/python/google/protobuf/json_format.py b/python/google/protobuf/json_format.py index 7921556e..57aa4077 100644 --- a/python/google/protobuf/json_format.py +++ b/python/google/protobuf/json_format.py @@ -42,6 +42,10 @@ Simple usage example: __author__ = 'jieluo@google.com (Jie Luo)' +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict #PY26 import base64 import json import math @@ -208,7 +212,8 @@ def _AnyMessageToJsonObject(message, including_default): """Converts Any message according to Proto3 JSON Specification.""" if not message.ListFields(): return {} - js = {} + # Must print @type first, use OrderedDict instead of {} + js = OrderedDict() type_url = message.type_url js['@type'] = type_url sub_message = _CreateMessageFromTypeUrl(type_url) -- cgit v1.2.3