@ -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 '