github.com/jhump/protoreflect@v1.16.0/dynamic/json.go (about) 1 package dynamic 2 3 // JSON marshalling and unmarshalling for dynamic messages 4 5 import ( 6 "bytes" 7 "encoding/base64" 8 "encoding/json" 9 "fmt" 10 "io" 11 "io/ioutil" 12 "math" 13 "reflect" 14 "sort" 15 "strconv" 16 "strings" 17 18 "github.com/golang/protobuf/jsonpb" 19 "github.com/golang/protobuf/proto" 20 "google.golang.org/protobuf/types/descriptorpb" 21 // link in the well-known-types that have a special JSON format 22 _ "google.golang.org/protobuf/types/known/anypb" 23 _ "google.golang.org/protobuf/types/known/durationpb" 24 _ "google.golang.org/protobuf/types/known/emptypb" 25 _ "google.golang.org/protobuf/types/known/structpb" 26 _ "google.golang.org/protobuf/types/known/timestamppb" 27 _ "google.golang.org/protobuf/types/known/wrapperspb" 28 29 "github.com/jhump/protoreflect/desc" 30 ) 31 32 var wellKnownTypeNames = map[string]struct{}{ 33 "google.protobuf.Any": {}, 34 "google.protobuf.Empty": {}, 35 "google.protobuf.Duration": {}, 36 "google.protobuf.Timestamp": {}, 37 // struct.proto 38 "google.protobuf.Struct": {}, 39 "google.protobuf.Value": {}, 40 "google.protobuf.ListValue": {}, 41 // wrappers.proto 42 "google.protobuf.DoubleValue": {}, 43 "google.protobuf.FloatValue": {}, 44 "google.protobuf.Int64Value": {}, 45 "google.protobuf.UInt64Value": {}, 46 "google.protobuf.Int32Value": {}, 47 "google.protobuf.UInt32Value": {}, 48 "google.protobuf.BoolValue": {}, 49 "google.protobuf.StringValue": {}, 50 "google.protobuf.BytesValue": {}, 51 } 52 53 // MarshalJSON serializes this message to bytes in JSON format, returning an 54 // error if the operation fails. The resulting bytes will be a valid UTF8 55 // string. 56 // 57 // This method uses a compact form: no newlines, and spaces between fields and 58 // between field identifiers and values are elided. 59 // 60 // This method is convenient shorthand for invoking MarshalJSONPB with a default 61 // (zero value) marshaler: 62 // 63 // m.MarshalJSONPB(&jsonpb.Marshaler{}) 64 // 65 // So enums are serialized using enum value name strings, and values that are 66 // not present (including those with default/zero value for messages defined in 67 // "proto3" syntax) are omitted. 68 func (m *Message) MarshalJSON() ([]byte, error) { 69 return m.MarshalJSONPB(&jsonpb.Marshaler{}) 70 } 71 72 // MarshalJSONIndent serializes this message to bytes in JSON format, returning 73 // an error if the operation fails. The resulting bytes will be a valid UTF8 74 // string. 75 // 76 // This method uses a "pretty-printed" form, with each field on its own line and 77 // spaces between field identifiers and values. Indentation of two spaces is 78 // used. 79 // 80 // This method is convenient shorthand for invoking MarshalJSONPB with a default 81 // (zero value) marshaler: 82 // 83 // m.MarshalJSONPB(&jsonpb.Marshaler{Indent: " "}) 84 // 85 // So enums are serialized using enum value name strings, and values that are 86 // not present (including those with default/zero value for messages defined in 87 // "proto3" syntax) are omitted. 88 func (m *Message) MarshalJSONIndent() ([]byte, error) { 89 return m.MarshalJSONPB(&jsonpb.Marshaler{Indent: " "}) 90 } 91 92 // MarshalJSONPB serializes this message to bytes in JSON format, returning an 93 // error if the operation fails. The resulting bytes will be a valid UTF8 94 // string. The given marshaler is used to convey options used during marshaling. 95 // 96 // If this message contains nested messages that are generated message types (as 97 // opposed to dynamic messages), the given marshaler is used to marshal it. 98 // 99 // When marshaling any nested messages, any jsonpb.AnyResolver configured in the 100 // given marshaler is augmented with knowledge of message types known to this 101 // message's descriptor (and its enclosing file and set of transitive 102 // dependencies). 103 func (m *Message) MarshalJSONPB(opts *jsonpb.Marshaler) ([]byte, error) { 104 var b indentBuffer 105 b.indent = opts.Indent 106 if len(opts.Indent) == 0 { 107 b.indentCount = -1 108 } 109 b.comma = true 110 if err := m.marshalJSON(&b, opts); err != nil { 111 return nil, err 112 } 113 return b.Bytes(), nil 114 } 115 116 func (m *Message) marshalJSON(b *indentBuffer, opts *jsonpb.Marshaler) error { 117 if m == nil { 118 _, err := b.WriteString("null") 119 return err 120 } 121 if r, changed := wrapResolver(opts.AnyResolver, m.mf, m.md.GetFile()); changed { 122 newOpts := *opts 123 newOpts.AnyResolver = r 124 opts = &newOpts 125 } 126 127 if ok, err := marshalWellKnownType(m, b, opts); ok { 128 return err 129 } 130 131 err := b.WriteByte('{') 132 if err != nil { 133 return err 134 } 135 err = b.start() 136 if err != nil { 137 return err 138 } 139 140 var tags []int 141 if opts.EmitDefaults { 142 tags = m.allKnownFieldTags() 143 } else { 144 tags = m.knownFieldTags() 145 } 146 147 first := true 148 149 for _, tag := range tags { 150 itag := int32(tag) 151 fd := m.FindFieldDescriptor(itag) 152 153 v, ok := m.values[itag] 154 if !ok { 155 if fd.GetOneOf() != nil { 156 // don't print defaults for fields in a oneof 157 continue 158 } 159 v = fd.GetDefaultValue() 160 } 161 162 err := b.maybeNext(&first) 163 if err != nil { 164 return err 165 } 166 err = marshalKnownFieldJSON(b, fd, v, opts) 167 if err != nil { 168 return err 169 } 170 } 171 172 err = b.end() 173 if err != nil { 174 return err 175 } 176 err = b.WriteByte('}') 177 if err != nil { 178 return err 179 } 180 181 return nil 182 } 183 184 func marshalWellKnownType(m *Message, b *indentBuffer, opts *jsonpb.Marshaler) (bool, error) { 185 fqn := m.md.GetFullyQualifiedName() 186 if _, ok := wellKnownTypeNames[fqn]; !ok { 187 return false, nil 188 } 189 190 msgType := proto.MessageType(fqn) 191 if msgType == nil { 192 // wtf? 193 panic(fmt.Sprintf("could not find registered message type for %q", fqn)) 194 } 195 196 // convert dynamic message to well-known type and let jsonpb marshal it 197 msg := reflect.New(msgType.Elem()).Interface().(proto.Message) 198 if err := m.MergeInto(msg); err != nil { 199 return true, err 200 } 201 return true, opts.Marshal(b, msg) 202 } 203 204 func marshalKnownFieldJSON(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}, opts *jsonpb.Marshaler) error { 205 var jsonName string 206 if opts.OrigName { 207 jsonName = fd.GetName() 208 } else { 209 jsonName = fd.AsFieldDescriptorProto().GetJsonName() 210 if jsonName == "" { 211 jsonName = fd.GetName() 212 } 213 } 214 if fd.IsExtension() { 215 var scope string 216 switch parent := fd.GetParent().(type) { 217 case *desc.FileDescriptor: 218 scope = parent.GetPackage() 219 default: 220 scope = parent.GetFullyQualifiedName() 221 } 222 if scope == "" { 223 jsonName = fmt.Sprintf("[%s]", jsonName) 224 } else { 225 jsonName = fmt.Sprintf("[%s.%s]", scope, jsonName) 226 } 227 } 228 err := writeJsonString(b, jsonName) 229 if err != nil { 230 return err 231 } 232 err = b.sep() 233 if err != nil { 234 return err 235 } 236 237 if isNil(v) { 238 _, err := b.WriteString("null") 239 return err 240 } 241 242 if fd.IsMap() { 243 err = b.WriteByte('{') 244 if err != nil { 245 return err 246 } 247 err = b.start() 248 if err != nil { 249 return err 250 } 251 252 md := fd.GetMessageType() 253 vfd := md.FindFieldByNumber(2) 254 255 mp := v.(map[interface{}]interface{}) 256 keys := make([]interface{}, 0, len(mp)) 257 for k := range mp { 258 keys = append(keys, k) 259 } 260 sort.Sort(sortable(keys)) 261 first := true 262 for _, mk := range keys { 263 mv := mp[mk] 264 err := b.maybeNext(&first) 265 if err != nil { 266 return err 267 } 268 269 err = marshalKnownFieldMapEntryJSON(b, mk, vfd, mv, opts) 270 if err != nil { 271 return err 272 } 273 } 274 275 err = b.end() 276 if err != nil { 277 return err 278 } 279 return b.WriteByte('}') 280 281 } else if fd.IsRepeated() { 282 err = b.WriteByte('[') 283 if err != nil { 284 return err 285 } 286 err = b.start() 287 if err != nil { 288 return err 289 } 290 291 sl := v.([]interface{}) 292 first := true 293 for _, slv := range sl { 294 err := b.maybeNext(&first) 295 if err != nil { 296 return err 297 } 298 err = marshalKnownFieldValueJSON(b, fd, slv, opts) 299 if err != nil { 300 return err 301 } 302 } 303 304 err = b.end() 305 if err != nil { 306 return err 307 } 308 return b.WriteByte(']') 309 310 } else { 311 return marshalKnownFieldValueJSON(b, fd, v, opts) 312 } 313 } 314 315 // sortable is used to sort map keys. Values will be integers (int32, int64, uint32, and uint64), 316 // bools, or strings. 317 type sortable []interface{} 318 319 func (s sortable) Len() int { 320 return len(s) 321 } 322 323 func (s sortable) Less(i, j int) bool { 324 vi := s[i] 325 vj := s[j] 326 switch reflect.TypeOf(vi).Kind() { 327 case reflect.Int32: 328 return vi.(int32) < vj.(int32) 329 case reflect.Int64: 330 return vi.(int64) < vj.(int64) 331 case reflect.Uint32: 332 return vi.(uint32) < vj.(uint32) 333 case reflect.Uint64: 334 return vi.(uint64) < vj.(uint64) 335 case reflect.String: 336 return vi.(string) < vj.(string) 337 case reflect.Bool: 338 return !vi.(bool) && vj.(bool) 339 default: 340 panic(fmt.Sprintf("cannot compare keys of type %v", reflect.TypeOf(vi))) 341 } 342 } 343 344 func (s sortable) Swap(i, j int) { 345 s[i], s[j] = s[j], s[i] 346 } 347 348 func isNil(v interface{}) bool { 349 if v == nil { 350 return true 351 } 352 rv := reflect.ValueOf(v) 353 return rv.Kind() == reflect.Ptr && rv.IsNil() 354 } 355 356 func marshalKnownFieldMapEntryJSON(b *indentBuffer, mk interface{}, vfd *desc.FieldDescriptor, mv interface{}, opts *jsonpb.Marshaler) error { 357 rk := reflect.ValueOf(mk) 358 var strkey string 359 switch rk.Kind() { 360 case reflect.Bool: 361 strkey = strconv.FormatBool(rk.Bool()) 362 case reflect.Int32, reflect.Int64: 363 strkey = strconv.FormatInt(rk.Int(), 10) 364 case reflect.Uint32, reflect.Uint64: 365 strkey = strconv.FormatUint(rk.Uint(), 10) 366 case reflect.String: 367 strkey = rk.String() 368 default: 369 return fmt.Errorf("invalid map key value: %v (%v)", mk, rk.Type()) 370 } 371 err := writeJsonString(b, strkey) 372 if err != nil { 373 return err 374 } 375 err = b.sep() 376 if err != nil { 377 return err 378 } 379 return marshalKnownFieldValueJSON(b, vfd, mv, opts) 380 } 381 382 func marshalKnownFieldValueJSON(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}, opts *jsonpb.Marshaler) error { 383 rv := reflect.ValueOf(v) 384 switch rv.Kind() { 385 case reflect.Int64: 386 return writeJsonString(b, strconv.FormatInt(rv.Int(), 10)) 387 case reflect.Int32: 388 ed := fd.GetEnumType() 389 if !opts.EnumsAsInts && ed != nil { 390 n := int32(rv.Int()) 391 vd := ed.FindValueByNumber(n) 392 if vd == nil { 393 _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10)) 394 return err 395 } else { 396 return writeJsonString(b, vd.GetName()) 397 } 398 } else { 399 _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10)) 400 return err 401 } 402 case reflect.Uint64: 403 return writeJsonString(b, strconv.FormatUint(rv.Uint(), 10)) 404 case reflect.Uint32: 405 _, err := b.WriteString(strconv.FormatUint(rv.Uint(), 10)) 406 return err 407 case reflect.Float32, reflect.Float64: 408 f := rv.Float() 409 var str string 410 if math.IsNaN(f) { 411 str = `"NaN"` 412 } else if math.IsInf(f, 1) { 413 str = `"Infinity"` 414 } else if math.IsInf(f, -1) { 415 str = `"-Infinity"` 416 } else { 417 var bits int 418 if rv.Kind() == reflect.Float32 { 419 bits = 32 420 } else { 421 bits = 64 422 } 423 str = strconv.FormatFloat(rv.Float(), 'g', -1, bits) 424 } 425 _, err := b.WriteString(str) 426 return err 427 case reflect.Bool: 428 _, err := b.WriteString(strconv.FormatBool(rv.Bool())) 429 return err 430 case reflect.Slice: 431 bstr := base64.StdEncoding.EncodeToString(rv.Bytes()) 432 return writeJsonString(b, bstr) 433 case reflect.String: 434 return writeJsonString(b, rv.String()) 435 default: 436 // must be a message 437 if isNil(v) { 438 _, err := b.WriteString("null") 439 return err 440 } 441 442 if dm, ok := v.(*Message); ok { 443 return dm.marshalJSON(b, opts) 444 } 445 446 var err error 447 if b.indentCount <= 0 || len(b.indent) == 0 { 448 err = opts.Marshal(b, v.(proto.Message)) 449 } else { 450 str, err := opts.MarshalToString(v.(proto.Message)) 451 if err != nil { 452 return err 453 } 454 indent := strings.Repeat(b.indent, b.indentCount) 455 pos := 0 456 // add indention prefix to each line 457 for pos < len(str) { 458 start := pos 459 nextPos := strings.Index(str[pos:], "\n") 460 if nextPos == -1 { 461 nextPos = len(str) 462 } else { 463 nextPos = pos + nextPos + 1 // include newline 464 } 465 line := str[start:nextPos] 466 if pos > 0 { 467 _, err = b.WriteString(indent) 468 if err != nil { 469 return err 470 } 471 } 472 _, err = b.WriteString(line) 473 if err != nil { 474 return err 475 } 476 pos = nextPos 477 } 478 } 479 return err 480 } 481 } 482 483 func writeJsonString(b *indentBuffer, s string) error { 484 if sbytes, err := json.Marshal(s); err != nil { 485 return err 486 } else { 487 _, err := b.Write(sbytes) 488 return err 489 } 490 } 491 492 // UnmarshalJSON de-serializes the message that is present, in JSON format, in 493 // the given bytes into this message. It first resets the current message. It 494 // returns an error if the given bytes do not contain a valid encoding of this 495 // message type in JSON format. 496 // 497 // This method is shorthand for invoking UnmarshalJSONPB with a default (zero 498 // value) unmarshaler: 499 // 500 // m.UnmarshalMergeJSONPB(&jsonpb.Unmarshaler{}, js) 501 // 502 // So unknown fields will result in an error, and no provided jsonpb.AnyResolver 503 // will be used when parsing google.protobuf.Any messages. 504 func (m *Message) UnmarshalJSON(js []byte) error { 505 return m.UnmarshalJSONPB(&jsonpb.Unmarshaler{}, js) 506 } 507 508 // UnmarshalMergeJSON de-serializes the message that is present, in JSON format, 509 // in the given bytes into this message. Unlike UnmarshalJSON, it does not first 510 // reset the message, instead merging the data in the given bytes into the 511 // existing data in this message. 512 func (m *Message) UnmarshalMergeJSON(js []byte) error { 513 return m.UnmarshalMergeJSONPB(&jsonpb.Unmarshaler{}, js) 514 } 515 516 // UnmarshalJSONPB de-serializes the message that is present, in JSON format, in 517 // the given bytes into this message. The given unmarshaler conveys options used 518 // when parsing the JSON. This function first resets the current message. It 519 // returns an error if the given bytes do not contain a valid encoding of this 520 // message type in JSON format. 521 // 522 // The decoding is lenient: 523 // 1. The JSON can refer to fields either by their JSON name or by their 524 // declared name. 525 // 2. The JSON can use either numeric values or string names for enum values. 526 // 527 // When instantiating nested messages, if this message's associated factory 528 // returns a generated message type (as opposed to a dynamic message), the given 529 // unmarshaler is used to unmarshal it. 530 // 531 // When unmarshaling any nested messages, any jsonpb.AnyResolver configured in 532 // the given unmarshaler is augmented with knowledge of message types known to 533 // this message's descriptor (and its enclosing file and set of transitive 534 // dependencies). 535 func (m *Message) UnmarshalJSONPB(opts *jsonpb.Unmarshaler, js []byte) error { 536 m.Reset() 537 if err := m.UnmarshalMergeJSONPB(opts, js); err != nil { 538 return err 539 } 540 return m.Validate() 541 } 542 543 // UnmarshalMergeJSONPB de-serializes the message that is present, in JSON 544 // format, in the given bytes into this message. The given unmarshaler conveys 545 // options used when parsing the JSON. Unlike UnmarshalJSONPB, it does not first 546 // reset the message, instead merging the data in the given bytes into the 547 // existing data in this message. 548 func (m *Message) UnmarshalMergeJSONPB(opts *jsonpb.Unmarshaler, js []byte) error { 549 r := newJsReader(js) 550 err := m.unmarshalJson(r, opts) 551 if err != nil { 552 return err 553 } 554 if t, err := r.poll(); err != io.EOF { 555 b, _ := ioutil.ReadAll(r.unread()) 556 s := fmt.Sprintf("%v%s", t, string(b)) 557 return fmt.Errorf("superfluous data found after JSON object: %q", s) 558 } 559 return nil 560 } 561 562 func unmarshalWellKnownType(m *Message, r *jsReader, opts *jsonpb.Unmarshaler) (bool, error) { 563 fqn := m.md.GetFullyQualifiedName() 564 if _, ok := wellKnownTypeNames[fqn]; !ok { 565 return false, nil 566 } 567 568 msgType := proto.MessageType(fqn) 569 if msgType == nil { 570 // wtf? 571 panic(fmt.Sprintf("could not find registered message type for %q", fqn)) 572 } 573 574 // extract json value from r 575 var js json.RawMessage 576 if err := json.NewDecoder(r.unread()).Decode(&js); err != nil { 577 return true, err 578 } 579 if err := r.skip(); err != nil { 580 return true, err 581 } 582 583 // unmarshal into well-known type and then convert to dynamic message 584 msg := reflect.New(msgType.Elem()).Interface().(proto.Message) 585 if err := opts.Unmarshal(bytes.NewReader(js), msg); err != nil { 586 return true, err 587 } 588 return true, m.MergeFrom(msg) 589 } 590 591 func (m *Message) unmarshalJson(r *jsReader, opts *jsonpb.Unmarshaler) error { 592 if r, changed := wrapResolver(opts.AnyResolver, m.mf, m.md.GetFile()); changed { 593 newOpts := *opts 594 newOpts.AnyResolver = r 595 opts = &newOpts 596 } 597 598 if ok, err := unmarshalWellKnownType(m, r, opts); ok { 599 return err 600 } 601 602 t, err := r.peek() 603 if err != nil { 604 return err 605 } 606 if t == nil { 607 // if json is simply "null" we do nothing 608 r.poll() 609 return nil 610 } 611 612 if err := r.beginObject(); err != nil { 613 return err 614 } 615 616 for r.hasNext() { 617 f, err := r.nextObjectKey() 618 if err != nil { 619 return err 620 } 621 fd := m.FindFieldDescriptorByJSONName(f) 622 if fd == nil { 623 if opts.AllowUnknownFields { 624 r.skip() 625 continue 626 } 627 return fmt.Errorf("message type %s has no known field named %s", m.md.GetFullyQualifiedName(), f) 628 } 629 v, err := unmarshalJsField(fd, r, m.mf, opts) 630 if err != nil { 631 return err 632 } 633 if v != nil { 634 if err := mergeField(m, fd, v); err != nil { 635 return err 636 } 637 } else if fd.GetOneOf() != nil { 638 // preserve explicit null for oneof fields (this is a little odd but 639 // mimics the behavior of jsonpb with oneofs in generated message types) 640 if fd.GetMessageType() != nil { 641 typ := m.mf.GetKnownTypeRegistry().GetKnownType(fd.GetMessageType().GetFullyQualifiedName()) 642 if typ != nil { 643 // typed nil 644 if typ.Kind() != reflect.Ptr { 645 typ = reflect.PtrTo(typ) 646 } 647 v = reflect.Zero(typ).Interface() 648 } else { 649 // can't use nil dynamic message, so we just use empty one instead 650 v = m.mf.NewDynamicMessage(fd.GetMessageType()) 651 } 652 if err := m.setField(fd, v); err != nil { 653 return err 654 } 655 } else { 656 // not a message... explicit null makes no sense 657 return fmt.Errorf("message type %s cannot set field %s to null: it is not a message type", m.md.GetFullyQualifiedName(), f) 658 } 659 } else { 660 m.clearField(fd) 661 } 662 } 663 664 if err := r.endObject(); err != nil { 665 return err 666 } 667 668 return nil 669 } 670 671 func isWellKnownValue(fd *desc.FieldDescriptor) bool { 672 return !fd.IsRepeated() && fd.GetType() == descriptorpb.FieldDescriptorProto_TYPE_MESSAGE && 673 fd.GetMessageType().GetFullyQualifiedName() == "google.protobuf.Value" 674 } 675 676 func isWellKnownListValue(fd *desc.FieldDescriptor) bool { 677 // we look for ListValue; but we also look for Value, which can be assigned a ListValue 678 return !fd.IsRepeated() && fd.GetType() == descriptorpb.FieldDescriptorProto_TYPE_MESSAGE && 679 (fd.GetMessageType().GetFullyQualifiedName() == "google.protobuf.ListValue" || 680 fd.GetMessageType().GetFullyQualifiedName() == "google.protobuf.Value") 681 } 682 683 func unmarshalJsField(fd *desc.FieldDescriptor, r *jsReader, mf *MessageFactory, opts *jsonpb.Unmarshaler) (interface{}, error) { 684 t, err := r.peek() 685 if err != nil { 686 return nil, err 687 } 688 if t == nil && !isWellKnownValue(fd) { 689 // if value is null, just return nil 690 // (unless field is google.protobuf.Value, in which case 691 // we fall through to parse it as an instance where its 692 // underlying value is set to a NullValue) 693 r.poll() 694 return nil, nil 695 } 696 697 if t == json.Delim('{') && fd.IsMap() { 698 entryType := fd.GetMessageType() 699 keyType := entryType.FindFieldByNumber(1) 700 valueType := entryType.FindFieldByNumber(2) 701 mp := map[interface{}]interface{}{} 702 703 // TODO: if there are just two map keys "key" and "value" and they have the right type of values, 704 // treat this JSON object as a single map entry message. (In keeping with support of map fields as 705 // if they were normal repeated field of entry messages as well as supporting a transition from 706 // optional to repeated...) 707 708 if err := r.beginObject(); err != nil { 709 return nil, err 710 } 711 for r.hasNext() { 712 kk, err := unmarshalJsFieldElement(keyType, r, mf, opts, false) 713 if err != nil { 714 return nil, err 715 } 716 vv, err := unmarshalJsFieldElement(valueType, r, mf, opts, true) 717 if err != nil { 718 return nil, err 719 } 720 mp[kk] = vv 721 } 722 if err := r.endObject(); err != nil { 723 return nil, err 724 } 725 726 return mp, nil 727 } else if t == json.Delim('[') && !isWellKnownListValue(fd) { 728 // We support parsing an array, even if field is not repeated, to mimic support in proto 729 // binary wire format that supports changing an optional field to repeated and vice versa. 730 // If the field is not repeated, we only keep the last value in the array. 731 732 if err := r.beginArray(); err != nil { 733 return nil, err 734 } 735 var sl []interface{} 736 var v interface{} 737 for r.hasNext() { 738 var err error 739 v, err = unmarshalJsFieldElement(fd, r, mf, opts, false) 740 if err != nil { 741 return nil, err 742 } 743 if fd.IsRepeated() && v != nil { 744 sl = append(sl, v) 745 } 746 } 747 if err := r.endArray(); err != nil { 748 return nil, err 749 } 750 if fd.IsMap() { 751 mp := map[interface{}]interface{}{} 752 for _, m := range sl { 753 msg := m.(*Message) 754 kk, err := msg.TryGetFieldByNumber(1) 755 if err != nil { 756 return nil, err 757 } 758 vv, err := msg.TryGetFieldByNumber(2) 759 if err != nil { 760 return nil, err 761 } 762 mp[kk] = vv 763 } 764 return mp, nil 765 } else if fd.IsRepeated() { 766 return sl, nil 767 } else { 768 return v, nil 769 } 770 } else { 771 // We support parsing a singular value, even if field is repeated, to mimic support in proto 772 // binary wire format that supports changing an optional field to repeated and vice versa. 773 // If the field is repeated, we store value as singleton slice of that one value. 774 775 v, err := unmarshalJsFieldElement(fd, r, mf, opts, false) 776 if err != nil { 777 return nil, err 778 } 779 if v == nil { 780 return nil, nil 781 } 782 if fd.IsRepeated() { 783 return []interface{}{v}, nil 784 } else { 785 return v, nil 786 } 787 } 788 } 789 790 func unmarshalJsFieldElement(fd *desc.FieldDescriptor, r *jsReader, mf *MessageFactory, opts *jsonpb.Unmarshaler, allowNilMessage bool) (interface{}, error) { 791 t, err := r.peek() 792 if err != nil { 793 return nil, err 794 } 795 796 switch fd.GetType() { 797 case descriptorpb.FieldDescriptorProto_TYPE_MESSAGE, 798 descriptorpb.FieldDescriptorProto_TYPE_GROUP: 799 800 if t == nil && allowNilMessage { 801 // if json is simply "null" return a nil pointer 802 r.poll() 803 return nilMessage(fd.GetMessageType()), nil 804 } 805 806 m := mf.NewMessage(fd.GetMessageType()) 807 if dm, ok := m.(*Message); ok { 808 if err := dm.unmarshalJson(r, opts); err != nil { 809 return nil, err 810 } 811 } else { 812 var msg json.RawMessage 813 if err := json.NewDecoder(r.unread()).Decode(&msg); err != nil { 814 return nil, err 815 } 816 if err := r.skip(); err != nil { 817 return nil, err 818 } 819 if err := opts.Unmarshal(bytes.NewReader([]byte(msg)), m); err != nil { 820 return nil, err 821 } 822 } 823 return m, nil 824 825 case descriptorpb.FieldDescriptorProto_TYPE_ENUM: 826 if e, err := r.nextNumber(); err != nil { 827 return nil, err 828 } else { 829 // value could be string or number 830 if i, err := e.Int64(); err != nil { 831 // number cannot be parsed, so see if it's an enum value name 832 vd := fd.GetEnumType().FindValueByName(string(e)) 833 if vd != nil { 834 return vd.GetNumber(), nil 835 } else { 836 return nil, fmt.Errorf("enum %q does not have value named %q", fd.GetEnumType().GetFullyQualifiedName(), e) 837 } 838 } else if i > math.MaxInt32 || i < math.MinInt32 { 839 return nil, NumericOverflowError 840 } else { 841 return int32(i), err 842 } 843 } 844 845 case descriptorpb.FieldDescriptorProto_TYPE_INT32, 846 descriptorpb.FieldDescriptorProto_TYPE_SINT32, 847 descriptorpb.FieldDescriptorProto_TYPE_SFIXED32: 848 if i, err := r.nextInt(); err != nil { 849 return nil, err 850 } else if i > math.MaxInt32 || i < math.MinInt32 { 851 return nil, NumericOverflowError 852 } else { 853 return int32(i), err 854 } 855 856 case descriptorpb.FieldDescriptorProto_TYPE_INT64, 857 descriptorpb.FieldDescriptorProto_TYPE_SINT64, 858 descriptorpb.FieldDescriptorProto_TYPE_SFIXED64: 859 return r.nextInt() 860 861 case descriptorpb.FieldDescriptorProto_TYPE_UINT32, 862 descriptorpb.FieldDescriptorProto_TYPE_FIXED32: 863 if i, err := r.nextUint(); err != nil { 864 return nil, err 865 } else if i > math.MaxUint32 { 866 return nil, NumericOverflowError 867 } else { 868 return uint32(i), err 869 } 870 871 case descriptorpb.FieldDescriptorProto_TYPE_UINT64, 872 descriptorpb.FieldDescriptorProto_TYPE_FIXED64: 873 return r.nextUint() 874 875 case descriptorpb.FieldDescriptorProto_TYPE_BOOL: 876 if str, ok := t.(string); ok { 877 if str == "true" { 878 r.poll() // consume token 879 return true, err 880 } else if str == "false" { 881 r.poll() // consume token 882 return false, err 883 } 884 } 885 return r.nextBool() 886 887 case descriptorpb.FieldDescriptorProto_TYPE_FLOAT: 888 if f, err := r.nextFloat(); err != nil { 889 return nil, err 890 } else { 891 return float32(f), nil 892 } 893 894 case descriptorpb.FieldDescriptorProto_TYPE_DOUBLE: 895 return r.nextFloat() 896 897 case descriptorpb.FieldDescriptorProto_TYPE_BYTES: 898 return r.nextBytes() 899 900 case descriptorpb.FieldDescriptorProto_TYPE_STRING: 901 return r.nextString() 902 903 default: 904 return nil, fmt.Errorf("unknown field type: %v", fd.GetType()) 905 } 906 } 907 908 type jsReader struct { 909 reader *bytes.Reader 910 dec *json.Decoder 911 current json.Token 912 peeked bool 913 } 914 915 func newJsReader(b []byte) *jsReader { 916 reader := bytes.NewReader(b) 917 dec := json.NewDecoder(reader) 918 dec.UseNumber() 919 return &jsReader{reader: reader, dec: dec} 920 } 921 922 func (r *jsReader) unread() io.Reader { 923 bufs := make([]io.Reader, 3) 924 var peeked []byte 925 if r.peeked { 926 if _, ok := r.current.(json.Delim); ok { 927 peeked = []byte(fmt.Sprintf("%v", r.current)) 928 } else { 929 peeked, _ = json.Marshal(r.current) 930 } 931 } 932 readerCopy := *r.reader 933 decCopy := *r.dec 934 935 bufs[0] = bytes.NewReader(peeked) 936 bufs[1] = decCopy.Buffered() 937 bufs[2] = &readerCopy 938 return &concatReader{bufs: bufs} 939 } 940 941 func (r *jsReader) hasNext() bool { 942 return r.dec.More() 943 } 944 945 func (r *jsReader) peek() (json.Token, error) { 946 if r.peeked { 947 return r.current, nil 948 } 949 t, err := r.dec.Token() 950 if err != nil { 951 return nil, err 952 } 953 r.peeked = true 954 r.current = t 955 return t, nil 956 } 957 958 func (r *jsReader) poll() (json.Token, error) { 959 if r.peeked { 960 ret := r.current 961 r.current = nil 962 r.peeked = false 963 return ret, nil 964 } 965 return r.dec.Token() 966 } 967 968 func (r *jsReader) beginObject() error { 969 _, err := r.expect(func(t json.Token) bool { return t == json.Delim('{') }, nil, "start of JSON object: '{'") 970 return err 971 } 972 973 func (r *jsReader) endObject() error { 974 _, err := r.expect(func(t json.Token) bool { return t == json.Delim('}') }, nil, "end of JSON object: '}'") 975 return err 976 } 977 978 func (r *jsReader) beginArray() error { 979 _, err := r.expect(func(t json.Token) bool { return t == json.Delim('[') }, nil, "start of array: '['") 980 return err 981 } 982 983 func (r *jsReader) endArray() error { 984 _, err := r.expect(func(t json.Token) bool { return t == json.Delim(']') }, nil, "end of array: ']'") 985 return err 986 } 987 988 func (r *jsReader) nextObjectKey() (string, error) { 989 return r.nextString() 990 } 991 992 func (r *jsReader) nextString() (string, error) { 993 t, err := r.expect(func(t json.Token) bool { _, ok := t.(string); return ok }, "", "string") 994 if err != nil { 995 return "", err 996 } 997 return t.(string), nil 998 } 999 1000 func (r *jsReader) nextBytes() ([]byte, error) { 1001 str, err := r.nextString() 1002 if err != nil { 1003 return nil, err 1004 } 1005 return base64.StdEncoding.DecodeString(str) 1006 } 1007 1008 func (r *jsReader) nextBool() (bool, error) { 1009 t, err := r.expect(func(t json.Token) bool { _, ok := t.(bool); return ok }, false, "boolean") 1010 if err != nil { 1011 return false, err 1012 } 1013 return t.(bool), nil 1014 } 1015 1016 func (r *jsReader) nextInt() (int64, error) { 1017 n, err := r.nextNumber() 1018 if err != nil { 1019 return 0, err 1020 } 1021 return n.Int64() 1022 } 1023 1024 func (r *jsReader) nextUint() (uint64, error) { 1025 n, err := r.nextNumber() 1026 if err != nil { 1027 return 0, err 1028 } 1029 return strconv.ParseUint(string(n), 10, 64) 1030 } 1031 1032 func (r *jsReader) nextFloat() (float64, error) { 1033 n, err := r.nextNumber() 1034 if err != nil { 1035 return 0, err 1036 } 1037 return n.Float64() 1038 } 1039 1040 func (r *jsReader) nextNumber() (json.Number, error) { 1041 t, err := r.expect(func(t json.Token) bool { return reflect.TypeOf(t).Kind() == reflect.String }, "0", "number") 1042 if err != nil { 1043 return "", err 1044 } 1045 switch t := t.(type) { 1046 case json.Number: 1047 return t, nil 1048 case string: 1049 return json.Number(t), nil 1050 } 1051 return "", fmt.Errorf("expecting a number but got %v", t) 1052 } 1053 1054 func (r *jsReader) skip() error { 1055 t, err := r.poll() 1056 if err != nil { 1057 return err 1058 } 1059 if t == json.Delim('[') { 1060 if err := r.skipArray(); err != nil { 1061 return err 1062 } 1063 } else if t == json.Delim('{') { 1064 if err := r.skipObject(); err != nil { 1065 return err 1066 } 1067 } 1068 return nil 1069 } 1070 1071 func (r *jsReader) skipArray() error { 1072 for r.hasNext() { 1073 if err := r.skip(); err != nil { 1074 return err 1075 } 1076 } 1077 if err := r.endArray(); err != nil { 1078 return err 1079 } 1080 return nil 1081 } 1082 1083 func (r *jsReader) skipObject() error { 1084 for r.hasNext() { 1085 // skip object key 1086 if err := r.skip(); err != nil { 1087 return err 1088 } 1089 // and value 1090 if err := r.skip(); err != nil { 1091 return err 1092 } 1093 } 1094 if err := r.endObject(); err != nil { 1095 return err 1096 } 1097 return nil 1098 } 1099 1100 func (r *jsReader) expect(predicate func(json.Token) bool, ifNil interface{}, expected string) (interface{}, error) { 1101 t, err := r.poll() 1102 if err != nil { 1103 return nil, err 1104 } 1105 if t == nil && ifNil != nil { 1106 return ifNil, nil 1107 } 1108 if !predicate(t) { 1109 return t, fmt.Errorf("bad input: expecting %s ; instead got %v", expected, t) 1110 } 1111 return t, nil 1112 } 1113 1114 type concatReader struct { 1115 bufs []io.Reader 1116 curr int 1117 } 1118 1119 func (r *concatReader) Read(p []byte) (n int, err error) { 1120 for { 1121 if r.curr >= len(r.bufs) { 1122 err = io.EOF 1123 return 1124 } 1125 var c int 1126 c, err = r.bufs[r.curr].Read(p) 1127 n += c 1128 if err != io.EOF { 1129 return 1130 } 1131 r.curr++ 1132 p = p[c:] 1133 } 1134 } 1135 1136 // AnyResolver returns a jsonpb.AnyResolver that uses the given file descriptors 1137 // to resolve message names. It uses the given factory, which may be nil, to 1138 // instantiate messages. The messages that it returns when resolving a type name 1139 // may often be dynamic messages. 1140 func AnyResolver(mf *MessageFactory, files ...*desc.FileDescriptor) jsonpb.AnyResolver { 1141 return &anyResolver{mf: mf, files: files} 1142 } 1143 1144 type anyResolver struct { 1145 mf *MessageFactory 1146 files []*desc.FileDescriptor 1147 ignored map[*desc.FileDescriptor]struct{} 1148 other jsonpb.AnyResolver 1149 } 1150 1151 func wrapResolver(r jsonpb.AnyResolver, mf *MessageFactory, f *desc.FileDescriptor) (jsonpb.AnyResolver, bool) { 1152 if r, ok := r.(*anyResolver); ok { 1153 if _, ok := r.ignored[f]; ok { 1154 // if the current resolver is ignoring this file, it's because another 1155 // (upstream) resolver is already handling it, so nothing to do 1156 return r, false 1157 } 1158 for _, file := range r.files { 1159 if file == f { 1160 // no need to wrap! 1161 return r, false 1162 } 1163 } 1164 // ignore files that will be checked by the resolver we're wrapping 1165 // (we'll just delegate and let it search those files) 1166 ignored := map[*desc.FileDescriptor]struct{}{} 1167 for i := range r.ignored { 1168 ignored[i] = struct{}{} 1169 } 1170 ignore(r.files, ignored) 1171 return &anyResolver{mf: mf, files: []*desc.FileDescriptor{f}, ignored: ignored, other: r}, true 1172 } 1173 return &anyResolver{mf: mf, files: []*desc.FileDescriptor{f}, other: r}, true 1174 } 1175 1176 func ignore(files []*desc.FileDescriptor, ignored map[*desc.FileDescriptor]struct{}) { 1177 for _, f := range files { 1178 if _, ok := ignored[f]; ok { 1179 continue 1180 } 1181 ignored[f] = struct{}{} 1182 ignore(f.GetDependencies(), ignored) 1183 } 1184 } 1185 1186 func (r *anyResolver) Resolve(typeUrl string) (proto.Message, error) { 1187 mname := typeUrl 1188 if slash := strings.LastIndex(mname, "/"); slash >= 0 { 1189 mname = mname[slash+1:] 1190 } 1191 1192 // see if the user-specified resolver is able to do the job 1193 if r.other != nil { 1194 msg, err := r.other.Resolve(typeUrl) 1195 if err == nil { 1196 return msg, nil 1197 } 1198 } 1199 1200 // try to find the message in our known set of files 1201 checked := map[*desc.FileDescriptor]struct{}{} 1202 for _, f := range r.files { 1203 md := r.findMessage(f, mname, checked) 1204 if md != nil { 1205 return r.mf.NewMessage(md), nil 1206 } 1207 } 1208 // failing that, see if the message factory knows about this type 1209 var ktr *KnownTypeRegistry 1210 if r.mf != nil { 1211 ktr = r.mf.ktr 1212 } else { 1213 ktr = (*KnownTypeRegistry)(nil) 1214 } 1215 m := ktr.CreateIfKnown(mname) 1216 if m != nil { 1217 return m, nil 1218 } 1219 1220 // no other resolver to fallback to? mimic default behavior 1221 mt := proto.MessageType(mname) 1222 if mt == nil { 1223 return nil, fmt.Errorf("unknown message type %q", mname) 1224 } 1225 return reflect.New(mt.Elem()).Interface().(proto.Message), nil 1226 } 1227 1228 func (r *anyResolver) findMessage(fd *desc.FileDescriptor, msgName string, checked map[*desc.FileDescriptor]struct{}) *desc.MessageDescriptor { 1229 // if this is an ignored descriptor, skip 1230 if _, ok := r.ignored[fd]; ok { 1231 return nil 1232 } 1233 1234 // bail if we've already checked this file 1235 if _, ok := checked[fd]; ok { 1236 return nil 1237 } 1238 checked[fd] = struct{}{} 1239 1240 // see if this file has the message 1241 md := fd.FindMessage(msgName) 1242 if md != nil { 1243 return md 1244 } 1245 1246 // if not, recursively search the file's imports 1247 for _, dep := range fd.GetDependencies() { 1248 md = r.findMessage(dep, msgName, checked) 1249 if md != nil { 1250 return md 1251 } 1252 } 1253 return nil 1254 } 1255 1256 var _ jsonpb.AnyResolver = (*anyResolver)(nil)