encoding/jsonpb: use knownfields.WhichOneof for marshalKnownValue
Change-Id: I363eec3ae22c9e1c6a29fa19f3ca048503251689
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/171241
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/encoding/jsonpb/well_known_types.go b/encoding/jsonpb/well_known_types.go
index 6a4659e..512adc2 100644
--- a/encoding/jsonpb/well_known_types.go
+++ b/encoding/jsonpb/well_known_types.go
@@ -533,22 +533,16 @@
func (o MarshalOptions) marshalKnownValue(m pref.Message) error {
msgType := m.Type()
- fieldDescs := msgType.Oneofs().Get(0).Fields()
knownFields := m.KnownFields()
-
- for i := 0; i < fieldDescs.Len(); i++ {
- fd := fieldDescs.Get(i)
- num := fd.Number()
- if !knownFields.Has(num) {
- continue
- }
- // Only one field should be set.
- val := knownFields.Get(num)
- return o.marshalSingular(val, fd)
+ num := knownFields.WhichOneof("kind")
+ if num == 0 {
+ // Return error if none of the fields is set.
+ return errors.New("%s: none of the oneof fields is set", msgType.FullName())
}
- // Return error if none of the fields are set.
- return errors.New("%s: none of the variants is set", msgType.FullName())
+ fd := msgType.Fields().ByNumber(num)
+ val := knownFields.Get(num)
+ return o.marshalSingular(val, fd)
}
func (o UnmarshalOptions) unmarshalKnownValue(m pref.Message) error {