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