fix json_format for python2.6:
1, objcect_pair_hook is not supported in python2.6, so duplicated key check is removed in 2.6 2, total_seconds is not suppoted in python2.6, changed to compute seconds directly
This commit is contained in:
parent
49f24afb45
commit
2850a98275
@ -410,6 +410,9 @@ class JsonFormatTest(JsonFormatBase):
|
||||
'"unknownName".')
|
||||
|
||||
def testDuplicateField(self):
|
||||
# Duplicate key check is not supported for python2.6
|
||||
if sys.version_info < (2, 7):
|
||||
return
|
||||
self.CheckError('{"int32Value": 1,\n"int32Value":2}',
|
||||
'Failed to load JSON: duplicate key int32Value')
|
||||
|
||||
@ -468,16 +471,18 @@ class JsonFormatTest(JsonFormatBase):
|
||||
(r'Failed to load JSON: Expecting property name'
|
||||
r'( enclosed in double quotes)?: line 1'),
|
||||
json_format.Parse, text, message)
|
||||
text = r'{"stringMap": {"a": 3, "\u0061": 2}}'
|
||||
self.assertRaisesRegexp(
|
||||
json_format.ParseError,
|
||||
'Failed to load JSON: duplicate key a',
|
||||
json_format.Parse, text, message)
|
||||
text = '{"boolMap": {"null": 1}}'
|
||||
self.assertRaisesRegexp(
|
||||
json_format.ParseError,
|
||||
'Failed to parse boolMap field: Expect "true" or "false", not null.',
|
||||
json_format.Parse, text, message)
|
||||
if sys.version_info < (2, 7):
|
||||
return
|
||||
text = r'{"stringMap": {"a": 3, "\u0061": 2}}'
|
||||
self.assertRaisesRegexp(
|
||||
json_format.ParseError,
|
||||
'Failed to load JSON: duplicate key a',
|
||||
json_format.Parse, text, message)
|
||||
|
||||
def testInvalidTimestamp(self):
|
||||
message = json_format_proto3_pb2.TestTimestamp()
|
||||
|
@ -37,6 +37,7 @@ from datetime import datetime
|
||||
import json
|
||||
import math
|
||||
import re
|
||||
import sys
|
||||
|
||||
from google.protobuf import descriptor
|
||||
|
||||
@ -114,7 +115,14 @@ def _RegularMessageToJsonObject(message, including_default_value_fields):
|
||||
# Convert a map field.
|
||||
js_map = {}
|
||||
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'],
|
||||
value[key], including_default_value_fields)
|
||||
js[name] = js_map
|
||||
@ -297,7 +305,11 @@ def Parse(text, message):
|
||||
"""
|
||||
if not isinstance(text, _UNICODETYPE): text = text.decode('utf-8')
|
||||
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:
|
||||
raise ParseError('Failed to load JSON: ' + str(e))
|
||||
_ConvertFieldValuePair(js, message)
|
||||
@ -419,7 +431,8 @@ def _ConvertTimestampMessage(value, message):
|
||||
second_value = time_value[:point_position]
|
||||
nano_value = time_value[point_position + 1:]
|
||||
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:
|
||||
raise ParseError(
|
||||
'Failed to parse Timestamp: nanos {0} more than '
|
||||
|
@ -2,8 +2,7 @@
|
||||
envlist =
|
||||
# cpp implementation on py34 is currently broken due to
|
||||
# changes introduced by http://bugs.python.org/issue22079.
|
||||
# py26 is currently broken due to the json_format
|
||||
py{27,33,34}-{cpp,python}
|
||||
py{26,27,33,34}-{cpp,python}
|
||||
|
||||
[testenv]
|
||||
usedevelop=true
|
||||
|
Loading…
Reference in New Issue
Block a user