|
@@ -37,6 +37,7 @@ from datetime import datetime
|
|
import json
|
|
import json
|
|
import math
|
|
import math
|
|
import re
|
|
import re
|
|
|
|
+import sys
|
|
|
|
|
|
from google.protobuf import descriptor
|
|
from google.protobuf import descriptor
|
|
|
|
|
|
@@ -114,7 +115,14 @@ def _RegularMessageToJsonObject(message, including_default_value_fields):
|
|
# Convert a map field.
|
|
# Convert a map field.
|
|
js_map = {}
|
|
js_map = {}
|
|
for key in value:
|
|
for key in value:
|
|
- js_map[key] = _ConvertFieldToJsonObject(
|
|
|
|
|
|
+ if isinstance(key, bool):
|
|
|
|
+ if key:
|
|
|
|
+ recorded_key = 'true'
|
|
|
|
+ else:
|
|
|
|
+ recorded_key = 'false'
|
|
|
|
+ else:
|
|
|
|
+ recorded_key = key
|
|
|
|
+ js_map[recorded_key] = _ConvertFieldToJsonObject(
|
|
field.message_type.fields_by_name['value'],
|
|
field.message_type.fields_by_name['value'],
|
|
value[key], including_default_value_fields)
|
|
value[key], including_default_value_fields)
|
|
js[name] = js_map
|
|
js[name] = js_map
|
|
@@ -297,7 +305,11 @@ def Parse(text, message):
|
|
"""
|
|
"""
|
|
if not isinstance(text, _UNICODETYPE): text = text.decode('utf-8')
|
|
if not isinstance(text, _UNICODETYPE): text = text.decode('utf-8')
|
|
try:
|
|
try:
|
|
- js = json.loads(text, object_pairs_hook=_DuplicateChecker)
|
|
|
|
|
|
+ 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)
|
|
except ValueError as e:
|
|
except ValueError as e:
|
|
raise ParseError('Failed to load JSON: ' + str(e))
|
|
raise ParseError('Failed to load JSON: ' + str(e))
|
|
_ConvertFieldValuePair(js, message)
|
|
_ConvertFieldValuePair(js, message)
|
|
@@ -419,7 +431,8 @@ def _ConvertTimestampMessage(value, message):
|
|
second_value = time_value[:point_position]
|
|
second_value = time_value[:point_position]
|
|
nano_value = time_value[point_position + 1:]
|
|
nano_value = time_value[point_position + 1:]
|
|
date_object = datetime.strptime(second_value, _TIMESTAMPFOMAT)
|
|
date_object = datetime.strptime(second_value, _TIMESTAMPFOMAT)
|
|
- seconds = (date_object - datetime(1970, 1, 1)).total_seconds()
|
|
|
|
|
|
+ td = date_object - datetime(1970, 1, 1)
|
|
|
|
+ seconds = td.seconds + td.days * 24 * 3600
|
|
if len(nano_value) > 9:
|
|
if len(nano_value) > 9:
|
|
raise ParseError(
|
|
raise ParseError(
|
|
'Failed to parse Timestamp: nanos {0} more than '
|
|
'Failed to parse Timestamp: nanos {0} more than '
|