@@ -224,10 +224,13 @@ def _RegularMessageToJsonObject(self, message, js):
224224
225225 try :
226226 for field , value in fields :
227- if self .preserving_proto_field_name :
227+ if field .is_extension :
228+ name = '[%s]' % field .full_name
229+ elif self .preserving_proto_field_name :
228230 name = field .name
229231 else :
230232 name = field .json_name
233+
231234 if _IsMapEntry (field ):
232235 # Convert a map field.
233236 v_field = field .message_type .fields_by_name ['value' ]
@@ -245,9 +248,6 @@ def _RegularMessageToJsonObject(self, message, js):
245248 elif field .is_repeated :
246249 # Convert a repeated field.
247250 js [name ] = [self ._FieldToJsonObject (field , k ) for k in value ]
248- elif field .is_extension :
249- name = '[%s]' % field .full_name
250- js [name ] = self ._FieldToJsonObject (field , value )
251251 else :
252252 js [name ] = self ._FieldToJsonObject (field , value )
253253
@@ -562,6 +562,25 @@ def _ConvertFieldValuePair(self, js, message, path):
562562 fields_by_json_name = dict (
563563 (f .json_name , f ) for f in message_descriptor .fields
564564 )
565+
566+ def _ClearFieldOrExtension (message , field ):
567+ if field .is_extension :
568+ message .ClearExtension (field )
569+ else :
570+ message .ClearField (field .name )
571+
572+ def _GetFieldOrExtension (message , field ):
573+ if field .is_extension :
574+ return message .Extensions [field ]
575+ else :
576+ return getattr (message , field .name )
577+
578+ def _SetFieldOrExtension (message , field , value ):
579+ if field .is_extension :
580+ message .Extensions [field ] = value
581+ else :
582+ setattr (message , field .name , value )
583+
565584 for name in js :
566585 try :
567586 field = fields_by_json_name .get (name , None )
@@ -625,25 +644,25 @@ def _ConvertFieldValuePair(self, js, message, path):
625644 field .cpp_type == descriptor .FieldDescriptor .CPPTYPE_MESSAGE
626645 and field .message_type .full_name == 'google.protobuf.Value'
627646 ):
628- sub_message = getattr (message , field . name )
647+ sub_message = _GetFieldOrExtension (message , field )
629648 sub_message .null_value = 0
630649 elif (
631650 field .cpp_type == descriptor .FieldDescriptor .CPPTYPE_ENUM
632651 and field .enum_type .full_name == 'google.protobuf.NullValue'
633652 ):
634- setattr (message , field . name , 0 )
653+ _SetFieldOrExtension (message , field , 0 )
635654 else :
636- message . ClearField ( field . name )
655+ _ClearFieldOrExtension ( message , field )
637656 continue
638657
639658 # Parse field value.
640659 if _IsMapEntry (field ):
641- message . ClearField ( field . name )
660+ _ClearFieldOrExtension ( message , field )
642661 self ._ConvertMapFieldValue (
643662 value , message , field , '{0}.{1}' .format (path , name )
644663 )
645664 elif field .is_repeated :
646- message . ClearField ( field . name )
665+ _ClearFieldOrExtension ( message , field )
647666 if not isinstance (value , _LIST_LIKE ):
648667 raise ParseError (
649668 'repeated field {0} must be in [] which is {1} at {2}' .format (
@@ -653,7 +672,7 @@ def _ConvertFieldValuePair(self, js, message, path):
653672 if field .cpp_type == descriptor .FieldDescriptor .CPPTYPE_MESSAGE :
654673 # Repeated message field.
655674 for index , item in enumerate (value ):
656- sub_message = getattr (message , field . name ).add ()
675+ sub_message = _GetFieldOrExtension (message , field ).add ()
657676 # None is a null_value in Value.
658677 if (
659678 item is None
@@ -683,21 +702,13 @@ def _ConvertFieldValuePair(self, js, message, path):
683702 message , field , item , '{0}.{1}[{2}]' .format (path , name , index )
684703 )
685704 elif field .cpp_type == descriptor .FieldDescriptor .CPPTYPE_MESSAGE :
686- if field .is_extension :
687- sub_message = message .Extensions [field ]
688- else :
689- sub_message = getattr (message , field .name )
705+ sub_message = _GetFieldOrExtension (message , field )
690706 sub_message .SetInParent ()
691707 self .ConvertMessage (value , sub_message , '{0}.{1}' .format (path , name ))
692708 else :
693- if field .is_extension :
694- self ._ConvertAndSetScalarExtension (
695- message , field , value , '{0}.{1}' .format (path , name )
696- )
697- else :
698- self ._ConvertAndSetScalar (
699- message , field , value , '{0}.{1}' .format (path , name )
700- )
709+ self ._ConvertAndSetScalar (
710+ message , field , value , '{0}.{1}' .format (path , name )
711+ )
701712 except ParseError as e :
702713 if field and field .containing_oneof is None :
703714 raise ParseError (
@@ -855,34 +866,27 @@ def _ConvertMapFieldValue(self, value, message, field, path):
855866 path = '{0}[{1}]' .format (path , key_value ),
856867 )
857868
858- def _ConvertAndSetScalarExtension (
859- self , message , extension_field , js_value , path
860- ):
861- """Convert scalar from js_value and assign it to message.Extensions[extension_field]."""
862- try :
863- message .Extensions [extension_field ] = _ConvertScalarFieldValue (
864- js_value , extension_field , path
865- )
866- except EnumStringValueParseError :
867- if not self .ignore_unknown_fields :
868- raise
869-
870869 def _ConvertAndSetScalar (self , message , field , js_value , path ):
871870 """Convert scalar from js_value and assign it to message.field."""
872871 try :
873- setattr (
874- message , field .name , _ConvertScalarFieldValue (js_value , field , path )
875- )
872+ value = _ConvertScalarFieldValue (js_value , field , path )
873+ if field .is_extension :
874+ message .Extensions [field ] = value
875+ else :
876+ setattr (message , field .name , value )
876877 except EnumStringValueParseError :
877878 if not self .ignore_unknown_fields :
878879 raise
879880
880881 def _ConvertAndAppendScalar (self , message , repeated_field , js_value , path ):
881882 """Convert scalar from js_value and append it to message.repeated_field."""
882883 try :
883- getattr (message , repeated_field .name ).append (
884- _ConvertScalarFieldValue (js_value , repeated_field , path )
885- )
884+ if repeated_field .is_extension :
885+ repeated = message .Extensions [repeated_field ]
886+ else :
887+ repeated = getattr (message , repeated_field .name )
888+ value = _ConvertScalarFieldValue (js_value , repeated_field , path )
889+ repeated .append (value )
886890 except EnumStringValueParseError :
887891 if not self .ignore_unknown_fields :
888892 raise
0 commit comments