@@ -135,14 +135,14 @@ func (u *Unmarshaler) unmarshalMessage(m protoreflect.Message, in []byte) error
135
135
md := m .Descriptor ()
136
136
fds := md .Fields ()
137
137
138
- if string (in ) == "null" && md .FullName () != "google.protobuf.Value" {
139
- return nil
140
- }
141
-
142
138
if jsu , ok := proto .MessageV1 (m .Interface ()).(JSONPBUnmarshaler ); ok {
143
139
return jsu .UnmarshalJSONPB (u , in )
144
140
}
145
141
142
+ if string (in ) == "null" && md .FullName () != "google.protobuf.Value" {
143
+ return nil
144
+ }
145
+
146
146
switch wellKnownType (md .FullName ()) {
147
147
case "Any" :
148
148
var jsonObject map [string ]json.RawMessage
@@ -332,11 +332,12 @@ func (u *Unmarshaler) unmarshalMessage(m protoreflect.Message, in []byte) error
332
332
raw = v
333
333
}
334
334
335
+ field := m .NewField (fd )
335
336
// Unmarshal the field value.
336
- if raw == nil || (string (raw ) == "null" && ! isSingularWellKnownValue (fd )) {
337
+ if raw == nil || (string (raw ) == "null" && ! isSingularWellKnownValue (fd ) && ! isSingularJSONPBUnmarshaler ( field , fd ) ) {
337
338
continue
338
339
}
339
- v , err := u .unmarshalValue (m . NewField ( fd ) , raw , fd )
340
+ v , err := u .unmarshalValue (field , raw , fd )
340
341
if err != nil {
341
342
return err
342
343
}
@@ -364,11 +365,12 @@ func (u *Unmarshaler) unmarshalMessage(m protoreflect.Message, in []byte) error
364
365
return fmt .Errorf ("extension field %q does not extend message %q" , xname , m .Descriptor ().FullName ())
365
366
}
366
367
368
+ field := m .NewField (fd )
367
369
// Unmarshal the field value.
368
- if raw == nil || (string (raw ) == "null" && ! isSingularWellKnownValue (fd )) {
370
+ if raw == nil || (string (raw ) == "null" && ! isSingularWellKnownValue (fd ) && ! isSingularJSONPBUnmarshaler ( field , fd ) ) {
369
371
continue
370
372
}
371
- v , err := u .unmarshalValue (m . NewField ( fd ) , raw , fd )
373
+ v , err := u .unmarshalValue (field , raw , fd )
372
374
if err != nil {
373
375
return err
374
376
}
@@ -390,6 +392,14 @@ func isSingularWellKnownValue(fd protoreflect.FieldDescriptor) bool {
390
392
return false
391
393
}
392
394
395
+ func isSingularJSONPBUnmarshaler (v protoreflect.Value , fd protoreflect.FieldDescriptor ) bool {
396
+ if fd .Message () != nil && fd .Cardinality () != protoreflect .Repeated {
397
+ _ , ok := proto .MessageV1 (v .Interface ()).(JSONPBUnmarshaler )
398
+ return ok
399
+ }
400
+ return false
401
+ }
402
+
393
403
func (u * Unmarshaler ) unmarshalValue (v protoreflect.Value , in []byte , fd protoreflect.FieldDescriptor ) (protoreflect.Value , error ) {
394
404
switch {
395
405
case fd .IsList ():
0 commit comments