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