diff options
Diffstat (limited to 'python/google/protobuf/json_format.py')
-rw-r--r-- | python/google/protobuf/json_format.py | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/python/google/protobuf/json_format.py b/python/google/protobuf/json_format.py index 878291db..58c94a47 100644 --- a/python/google/protobuf/json_format.py +++ b/python/google/protobuf/json_format.py @@ -42,21 +42,28 @@ Simple usage example: __author__ = 'jieluo@google.com (Jie Luo)' +# pylint: disable=g-statement-before-imports,g-import-not-at-top try: from collections import OrderedDict except ImportError: - from ordereddict import OrderedDict #PY26 + from ordereddict import OrderedDict # PY26 +# pylint: enable=g-statement-before-imports,g-import-not-at-top + import base64 import json import math + +from operator import methodcaller + import re -import six import sys -from operator import methodcaller +import six + from google.protobuf import descriptor from google.protobuf import symbol_database + _TIMESTAMPFOMAT = '%Y-%m-%dT%H:%M:%S' _INT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_INT32, descriptor.FieldDescriptor.CPPTYPE_UINT32, @@ -93,7 +100,8 @@ def MessageToJson(message, including_default_value_fields=False, preserving_proto_field_name=False, indent=2, - sort_keys=False): + sort_keys=False, + use_integers_for_enums=False): """Converts protobuf message to JSON format. Args: @@ -108,18 +116,21 @@ def MessageToJson(message, indent: The JSON object will be pretty-printed with this indent level. An indent level of 0 or negative will only insert newlines. sort_keys: If True, then the output will be sorted by field names. + use_integers_for_enums: If true, print integers instead of enum names. Returns: A string containing the JSON formatted protocol buffer message. """ printer = _Printer(including_default_value_fields, - preserving_proto_field_name) + preserving_proto_field_name, + use_integers_for_enums) return printer.ToJsonString(message, indent, sort_keys) def MessageToDict(message, including_default_value_fields=False, - preserving_proto_field_name=False): + preserving_proto_field_name=False, + use_integers_for_enums=False): """Converts protobuf message to a dictionary. When the dictionary is encoded to JSON, it conforms to proto3 JSON spec. @@ -133,12 +144,14 @@ def MessageToDict(message, preserving_proto_field_name: If True, use the original proto field names as defined in the .proto file. If False, convert the field names to lowerCamelCase. + use_integers_for_enums: If true, print integers instead of enum names. Returns: A dict representation of the protocol buffer message. """ printer = _Printer(including_default_value_fields, - preserving_proto_field_name) + preserving_proto_field_name, + use_integers_for_enums) # pylint: disable=protected-access return printer._MessageToJsonObject(message) @@ -154,9 +167,11 @@ class _Printer(object): def __init__(self, including_default_value_fields=False, - preserving_proto_field_name=False): + preserving_proto_field_name=False, + use_integers_for_enums=False): self.including_default_value_fields = including_default_value_fields self.preserving_proto_field_name = preserving_proto_field_name + self.use_integers_for_enums = use_integers_for_enums def ToJsonString(self, message, indent, sort_keys): js = self._MessageToJsonObject(message) @@ -247,6 +262,8 @@ class _Printer(object): if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: return self._MessageToJsonObject(value) elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: + if self.use_integers_for_enums: + return value enum_value = field.enum_type.values_by_number.get(value, None) if enum_value is not None: return enum_value.name @@ -379,11 +396,7 @@ def Parse(text, message, ignore_unknown_fields=False): """ if not isinstance(text, six.text_type): text = text.decode('utf-8') try: - if sys.version_info < (2, 7): - # object_pair_hook is not supported before python2.7 - js = json.loads(text) - else: - js = json.loads(text, object_pairs_hook=_DuplicateChecker) + js = json.loads(text, object_pairs_hook=_DuplicateChecker) except ValueError as e: raise ParseError('Failed to load JSON: {0}.'.format(str(e))) return ParseDict(js, message, ignore_unknown_fields) |