1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
39 package jsonpb
40
41 import (
42 "bytes"
43 "encoding/json"
44 "errors"
45 "fmt"
46 "io"
47 "math"
48 "reflect"
49 "sort"
50 "strconv"
51 "strings"
52 "time"
53
54 "github.com/gogo/protobuf/proto"
55 "github.com/gogo/protobuf/types"
56 )
57
58 const secondInNanos = int64(time.Second / time.Nanosecond)
59 const maxSecondsInDuration = 315576000000
60
61
62
63 type Marshaler struct {
64
65 EnumsAsInts bool
66
67
68 EmitDefaults bool
69
70
71
72
73
74 Indent string
75
76
77 OrigName bool
78
79
80
81
82
83 AnyResolver AnyResolver
84 }
85
86
87
88 type AnyResolver interface {
89 Resolve(typeUrl string) (proto.Message, error)
90 }
91
92 func defaultResolveAny(typeUrl string) (proto.Message, error) {
93
94 mname := typeUrl
95 if slash := strings.LastIndex(mname, "/"); slash >= 0 {
96 mname = mname[slash+1:]
97 }
98 mt := proto.MessageType(mname)
99 if mt == nil {
100 return nil, fmt.Errorf("unknown message type %q", mname)
101 }
102 return reflect.New(mt.Elem()).Interface().(proto.Message), nil
103 }
104
105
106
107
108
109
110
111
112 type JSONPBMarshaler interface {
113 MarshalJSONPB(*Marshaler) ([]byte, error)
114 }
115
116
117
118
119
120
121
122
123 type JSONPBUnmarshaler interface {
124 UnmarshalJSONPB(*Unmarshaler, []byte) error
125 }
126
127
128 func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error {
129 v := reflect.ValueOf(pb)
130 if pb == nil || (v.Kind() == reflect.Ptr && v.IsNil()) {
131 return errors.New("Marshal called with nil")
132 }
133
134 if err := checkRequiredFields(pb); err != nil {
135 return err
136 }
137 writer := &errWriter{writer: out}
138 return m.marshalObject(writer, pb, "", "")
139 }
140
141
142 func (m *Marshaler) MarshalToString(pb proto.Message) (string, error) {
143 var buf bytes.Buffer
144 if err := m.Marshal(&buf, pb); err != nil {
145 return "", err
146 }
147 return buf.String(), nil
148 }
149
150 type int32Slice []int32
151
152 var nonFinite = map[string]float64{
153 `"NaN"`: math.NaN(),
154 `"Infinity"`: math.Inf(1),
155 `"-Infinity"`: math.Inf(-1),
156 }
157
158
159 func (s int32Slice) Len() int { return len(s) }
160 func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] }
161 func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
162
163 type isWkt interface {
164 XXX_WellKnownType() string
165 }
166
167 var (
168 wktType = reflect.TypeOf((*isWkt)(nil)).Elem()
169 messageType = reflect.TypeOf((*proto.Message)(nil)).Elem()
170 )
171
172
173 func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error {
174 if jsm, ok := v.(JSONPBMarshaler); ok {
175 b, err := jsm.MarshalJSONPB(m)
176 if err != nil {
177 return err
178 }
179 if typeURL != "" {
180
181 var js map[string]*json.RawMessage
182 if err = json.Unmarshal(b, &js); err != nil {
183 return fmt.Errorf("type %T produced invalid JSON: %v", v, err)
184 }
185 turl, err := json.Marshal(typeURL)
186 if err != nil {
187 return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err)
188 }
189 js["@type"] = (*json.RawMessage)(&turl)
190 if m.Indent != "" {
191 b, err = json.MarshalIndent(js, indent, m.Indent)
192 } else {
193 b, err = json.Marshal(js)
194 }
195 if err != nil {
196 return err
197 }
198 }
199
200 out.write(string(b))
201 return out.err
202 }
203
204 s := reflect.ValueOf(v).Elem()
205
206
207 if wkt, ok := v.(isWkt); ok {
208 switch wkt.XXX_WellKnownType() {
209 case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value",
210 "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue":
211
212
213 sprop := proto.GetProperties(s.Type())
214 return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent)
215 case "Any":
216
217 return m.marshalAny(out, v, indent)
218 case "Duration":
219 s, ns := s.Field(0).Int(), s.Field(1).Int()
220 if s < -maxSecondsInDuration || s > maxSecondsInDuration {
221 return fmt.Errorf("seconds out of range %v", s)
222 }
223 if ns <= -secondInNanos || ns >= secondInNanos {
224 return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos)
225 }
226 if (s > 0 && ns < 0) || (s < 0 && ns > 0) {
227 return errors.New("signs of seconds and nanos do not match")
228 }
229
230
231 f := "%d.%09d"
232 if ns < 0 {
233 ns = -ns
234 if s == 0 {
235 f = "-%d.%09d"
236 }
237 }
238 x := fmt.Sprintf(f, s, ns)
239 x = strings.TrimSuffix(x, "000")
240 x = strings.TrimSuffix(x, "000")
241 x = strings.TrimSuffix(x, ".000")
242 out.write(`"`)
243 out.write(x)
244 out.write(`s"`)
245 return out.err
246 case "Struct", "ListValue":
247
248
249 return m.marshalValue(out, &proto.Properties{}, s.Field(0), indent)
250 case "Timestamp":
251
252
253 s, ns := s.Field(0).Int(), s.Field(1).Int()
254 if ns < 0 || ns >= secondInNanos {
255 return fmt.Errorf("ns out of range [0, %v)", secondInNanos)
256 }
257 t := time.Unix(s, ns).UTC()
258
259 x := t.Format("2006-01-02T15:04:05.000000000")
260 x = strings.TrimSuffix(x, "000")
261 x = strings.TrimSuffix(x, "000")
262 x = strings.TrimSuffix(x, ".000")
263 out.write(`"`)
264 out.write(x)
265 out.write(`Z"`)
266 return out.err
267 case "Value":
268
269 kind := s.Field(0)
270 if kind.IsNil() {
271
272 return errors.New("nil Value")
273 }
274
275 x := kind.Elem().Elem().Field(0)
276
277 return m.marshalValue(out, &proto.Properties{}, x, indent)
278 }
279 }
280
281 out.write("{")
282 if m.Indent != "" {
283 out.write("\n")
284 }
285
286 firstField := true
287
288 if typeURL != "" {
289 if err := m.marshalTypeURL(out, indent, typeURL); err != nil {
290 return err
291 }
292 firstField = false
293 }
294
295 for i := 0; i < s.NumField(); i++ {
296 value := s.Field(i)
297 valueField := s.Type().Field(i)
298 if strings.HasPrefix(valueField.Name, "XXX_") {
299 continue
300 }
301
302
303 if valueField.Tag.Get("protobuf") == "" && valueField.Tag.Get("protobuf_oneof") == "" {
304 continue
305 }
306
307
308 switch value.Kind() {
309 case reflect.Chan, reflect.Func, reflect.Interface:
310 if value.IsNil() {
311 continue
312 }
313 }
314
315 if !m.EmitDefaults {
316 switch value.Kind() {
317 case reflect.Bool:
318 if !value.Bool() {
319 continue
320 }
321 case reflect.Int32, reflect.Int64:
322 if value.Int() == 0 {
323 continue
324 }
325 case reflect.Uint32, reflect.Uint64:
326 if value.Uint() == 0 {
327 continue
328 }
329 case reflect.Float32, reflect.Float64:
330 if value.Float() == 0 {
331 continue
332 }
333 case reflect.String:
334 if value.Len() == 0 {
335 continue
336 }
337 case reflect.Map, reflect.Ptr, reflect.Slice:
338 if value.IsNil() {
339 continue
340 }
341 }
342 }
343
344
345 if valueField.Tag.Get("protobuf_oneof") != "" {
346
347 sv := value.Elem().Elem()
348 value = sv.Field(0)
349 valueField = sv.Type().Field(0)
350 }
351 prop := jsonProperties(valueField, m.OrigName)
352 if !firstField {
353 m.writeSep(out)
354 }
355
356
357
358
359 if value.Kind() == reflect.Map {
360 if tag := valueField.Tag.Get("protobuf"); tag != "" {
361 for _, v := range strings.Split(tag, ",") {
362 if !strings.HasPrefix(v, "castvaluetype=") {
363 continue
364 }
365 v = strings.TrimPrefix(v, "castvaluetype=")
366 prop.MapValProp.CustomType = v
367 break
368 }
369 }
370 }
371 if err := m.marshalField(out, prop, value, indent); err != nil {
372 return err
373 }
374 firstField = false
375 }
376
377
378 if ep, ok := v.(proto.Message); ok {
379 extensions := proto.RegisteredExtensions(v)
380
381 ids := make([]int32, 0, len(extensions))
382 for id, desc := range extensions {
383 if !proto.HasExtension(ep, desc) {
384 continue
385 }
386 ids = append(ids, id)
387 }
388 sort.Sort(int32Slice(ids))
389 for _, id := range ids {
390 desc := extensions[id]
391 if desc == nil {
392
393 continue
394 }
395 ext, extErr := proto.GetExtension(ep, desc)
396 if extErr != nil {
397 return extErr
398 }
399 value := reflect.ValueOf(ext)
400 var prop proto.Properties
401 prop.Parse(desc.Tag)
402 prop.JSONName = fmt.Sprintf("[%s]", desc.Name)
403 if !firstField {
404 m.writeSep(out)
405 }
406 if err := m.marshalField(out, &prop, value, indent); err != nil {
407 return err
408 }
409 firstField = false
410 }
411
412 }
413
414 if m.Indent != "" {
415 out.write("\n")
416 out.write(indent)
417 }
418 out.write("}")
419 return out.err
420 }
421
422 func (m *Marshaler) writeSep(out *errWriter) {
423 if m.Indent != "" {
424 out.write(",\n")
425 } else {
426 out.write(",")
427 }
428 }
429
430 func (m *Marshaler) marshalAny(out *errWriter, any proto.Message, indent string) error {
431
432
433
434
435 v := reflect.ValueOf(any).Elem()
436 turl := v.Field(0).String()
437 val := v.Field(1).Bytes()
438
439 var msg proto.Message
440 var err error
441 if m.AnyResolver != nil {
442 msg, err = m.AnyResolver.Resolve(turl)
443 } else {
444 msg, err = defaultResolveAny(turl)
445 }
446 if err != nil {
447 return err
448 }
449
450 if err := proto.Unmarshal(val, msg); err != nil {
451 return err
452 }
453
454 if _, ok := msg.(isWkt); ok {
455 out.write("{")
456 if m.Indent != "" {
457 out.write("\n")
458 }
459 if err := m.marshalTypeURL(out, indent, turl); err != nil {
460 return err
461 }
462 m.writeSep(out)
463 if m.Indent != "" {
464 out.write(indent)
465 out.write(m.Indent)
466 out.write(`"value": `)
467 } else {
468 out.write(`"value":`)
469 }
470 if err := m.marshalObject(out, msg, indent+m.Indent, ""); err != nil {
471 return err
472 }
473 if m.Indent != "" {
474 out.write("\n")
475 out.write(indent)
476 }
477 out.write("}")
478 return out.err
479 }
480
481 return m.marshalObject(out, msg, indent, turl)
482 }
483
484 func (m *Marshaler) marshalTypeURL(out *errWriter, indent, typeURL string) error {
485 if m.Indent != "" {
486 out.write(indent)
487 out.write(m.Indent)
488 }
489 out.write(`"@type":`)
490 if m.Indent != "" {
491 out.write(" ")
492 }
493 b, err := json.Marshal(typeURL)
494 if err != nil {
495 return err
496 }
497 out.write(string(b))
498 return out.err
499 }
500
501
502 func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error {
503 if m.Indent != "" {
504 out.write(indent)
505 out.write(m.Indent)
506 }
507 out.write(`"`)
508 out.write(prop.JSONName)
509 out.write(`":`)
510 if m.Indent != "" {
511 out.write(" ")
512 }
513 if err := m.marshalValue(out, prop, v, indent); err != nil {
514 return err
515 }
516 return nil
517 }
518
519
520 func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error {
521
522 v = reflect.Indirect(v)
523
524
525 if v.Kind() == reflect.Invalid {
526 out.write("null")
527 return out.err
528 }
529
530
531 if v.Kind() == reflect.Slice && v.Type().Elem().Kind() != reflect.Uint8 {
532 out.write("[")
533 comma := ""
534 for i := 0; i < v.Len(); i++ {
535 sliceVal := v.Index(i)
536 out.write(comma)
537 if m.Indent != "" {
538 out.write("\n")
539 out.write(indent)
540 out.write(m.Indent)
541 out.write(m.Indent)
542 }
543 if err := m.marshalValue(out, prop, sliceVal, indent+m.Indent); err != nil {
544 return err
545 }
546 comma = ","
547 }
548 if m.Indent != "" {
549 out.write("\n")
550 out.write(indent)
551 out.write(m.Indent)
552 }
553 out.write("]")
554 return out.err
555 }
556
557
558
559 if v.Type().Implements(wktType) {
560 wkt := v.Interface().(isWkt)
561 switch wkt.XXX_WellKnownType() {
562 case "NullValue":
563 out.write("null")
564 return out.err
565 }
566 }
567
568 if t, ok := v.Interface().(time.Time); ok {
569 ts, err := types.TimestampProto(t)
570 if err != nil {
571 return err
572 }
573 return m.marshalValue(out, prop, reflect.ValueOf(ts), indent)
574 }
575
576 if d, ok := v.Interface().(time.Duration); ok {
577 dur := types.DurationProto(d)
578 return m.marshalValue(out, prop, reflect.ValueOf(dur), indent)
579 }
580
581
582 if !m.EnumsAsInts && prop.Enum != "" {
583
584
585
586 enumStr := v.Interface().(fmt.Stringer).String()
587 var valStr string
588 if v.Kind() == reflect.Ptr {
589 valStr = strconv.Itoa(int(v.Elem().Int()))
590 } else {
591 valStr = strconv.Itoa(int(v.Int()))
592 }
593
594 if m, ok := v.Interface().(interface {
595 MarshalJSON() ([]byte, error)
596 }); ok {
597 data, err := m.MarshalJSON()
598 if err != nil {
599 return err
600 }
601 enumStr = string(data)
602 enumStr, err = strconv.Unquote(enumStr)
603 if err != nil {
604 return err
605 }
606 }
607
608 isKnownEnum := enumStr != valStr
609
610 if isKnownEnum {
611 out.write(`"`)
612 }
613 out.write(enumStr)
614 if isKnownEnum {
615 out.write(`"`)
616 }
617 return out.err
618 }
619
620
621 if v.Kind() == reflect.Struct {
622 i := v
623 if v.CanAddr() {
624 i = v.Addr()
625 } else {
626 i = reflect.New(v.Type())
627 i.Elem().Set(v)
628 }
629 iface := i.Interface()
630 if iface == nil {
631 out.write(`null`)
632 return out.err
633 }
634
635 if m, ok := v.Interface().(interface {
636 MarshalJSON() ([]byte, error)
637 }); ok {
638 data, err := m.MarshalJSON()
639 if err != nil {
640 return err
641 }
642 out.write(string(data))
643 return nil
644 }
645
646 pm, ok := iface.(proto.Message)
647 if !ok {
648 if prop.CustomType == "" {
649 return fmt.Errorf("%v does not implement proto.Message", v.Type())
650 }
651 t := proto.MessageType(prop.CustomType)
652 if t == nil || !i.Type().ConvertibleTo(t) {
653 return fmt.Errorf("%v declared custom type %s but it is not convertible to %v", v.Type(), prop.CustomType, t)
654 }
655 pm = i.Convert(t).Interface().(proto.Message)
656 }
657 return m.marshalObject(out, pm, indent+m.Indent, "")
658 }
659
660
661
662 if v.Kind() == reflect.Map {
663 out.write(`{`)
664 keys := v.MapKeys()
665 sort.Sort(mapKeys(keys))
666 for i, k := range keys {
667 if i > 0 {
668 out.write(`,`)
669 }
670 if m.Indent != "" {
671 out.write("\n")
672 out.write(indent)
673 out.write(m.Indent)
674 out.write(m.Indent)
675 }
676
677
678 b, err := json.Marshal(k.Interface())
679 if err != nil {
680 return err
681 }
682 s := string(b)
683
684
685 if !strings.HasPrefix(s, `"`) {
686 b, err := json.Marshal(s)
687 if err != nil {
688 return err
689 }
690 s = string(b)
691 }
692
693 out.write(s)
694 out.write(`:`)
695 if m.Indent != "" {
696 out.write(` `)
697 }
698
699 vprop := prop
700 if prop != nil && prop.MapValProp != nil {
701 vprop = prop.MapValProp
702 }
703 if err := m.marshalValue(out, vprop, v.MapIndex(k), indent+m.Indent); err != nil {
704 return err
705 }
706 }
707 if m.Indent != "" {
708 out.write("\n")
709 out.write(indent)
710 out.write(m.Indent)
711 }
712 out.write(`}`)
713 return out.err
714 }
715
716
717 if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 {
718 f := v.Float()
719 var sval string
720 switch {
721 case math.IsInf(f, 1):
722 sval = `"Infinity"`
723 case math.IsInf(f, -1):
724 sval = `"-Infinity"`
725 case math.IsNaN(f):
726 sval = `"NaN"`
727 }
728 if sval != "" {
729 out.write(sval)
730 return out.err
731 }
732 }
733
734
735 b, err := json.Marshal(v.Interface())
736 if err != nil {
737 return err
738 }
739 needToQuote := string(b[0]) != `"` && (v.Kind() == reflect.Int64 || v.Kind() == reflect.Uint64)
740 if needToQuote {
741 out.write(`"`)
742 }
743 out.write(string(b))
744 if needToQuote {
745 out.write(`"`)
746 }
747 return out.err
748 }
749
750
751
752 type Unmarshaler struct {
753
754
755 AllowUnknownFields bool
756
757
758
759
760
761 AnyResolver AnyResolver
762 }
763
764
765
766
767 func (u *Unmarshaler) UnmarshalNext(dec *json.Decoder, pb proto.Message) error {
768 inputValue := json.RawMessage{}
769 if err := dec.Decode(&inputValue); err != nil {
770 return err
771 }
772 if err := u.unmarshalValue(reflect.ValueOf(pb).Elem(), inputValue, nil); err != nil {
773 return err
774 }
775 return checkRequiredFields(pb)
776 }
777
778
779
780
781 func (u *Unmarshaler) Unmarshal(r io.Reader, pb proto.Message) error {
782 dec := json.NewDecoder(r)
783 return u.UnmarshalNext(dec, pb)
784 }
785
786
787
788
789 func UnmarshalNext(dec *json.Decoder, pb proto.Message) error {
790 return new(Unmarshaler).UnmarshalNext(dec, pb)
791 }
792
793
794
795
796 func Unmarshal(r io.Reader, pb proto.Message) error {
797 return new(Unmarshaler).Unmarshal(r, pb)
798 }
799
800
801
802
803 func UnmarshalString(str string, pb proto.Message) error {
804 return new(Unmarshaler).Unmarshal(strings.NewReader(str), pb)
805 }
806
807
808
809 func (u *Unmarshaler) unmarshalValue(target reflect.Value, inputValue json.RawMessage, prop *proto.Properties) error {
810 targetType := target.Type()
811
812
813 if targetType.Kind() == reflect.Ptr {
814
815
816 _, isJSONPBUnmarshaler := target.Interface().(JSONPBUnmarshaler)
817 if string(inputValue) == "null" && targetType != reflect.TypeOf(&types.Value{}) && !isJSONPBUnmarshaler {
818 return nil
819 }
820 target.Set(reflect.New(targetType.Elem()))
821
822 return u.unmarshalValue(target.Elem(), inputValue, prop)
823 }
824
825 if jsu, ok := target.Addr().Interface().(JSONPBUnmarshaler); ok {
826 return jsu.UnmarshalJSONPB(u, []byte(inputValue))
827 }
828
829
830 if w, ok := target.Addr().Interface().(isWkt); ok {
831 switch w.XXX_WellKnownType() {
832 case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value",
833 "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue":
834 return u.unmarshalValue(target.Field(0), inputValue, prop)
835 case "Any":
836
837
838
839 var jsonFields map[string]*json.RawMessage
840 if err := json.Unmarshal(inputValue, &jsonFields); err != nil {
841 return err
842 }
843
844 val, ok := jsonFields["@type"]
845 if !ok || val == nil {
846 return errors.New("Any JSON doesn't have '@type'")
847 }
848
849 var turl string
850 if err := json.Unmarshal([]byte(*val), &turl); err != nil {
851 return fmt.Errorf("can't unmarshal Any's '@type': %q", *val)
852 }
853 target.Field(0).SetString(turl)
854
855 var m proto.Message
856 var err error
857 if u.AnyResolver != nil {
858 m, err = u.AnyResolver.Resolve(turl)
859 } else {
860 m, err = defaultResolveAny(turl)
861 }
862 if err != nil {
863 return err
864 }
865
866 if _, ok := m.(isWkt); ok {
867 val, ok := jsonFields["value"]
868 if !ok {
869 return errors.New("Any JSON doesn't have 'value'")
870 }
871
872 if err = u.unmarshalValue(reflect.ValueOf(m).Elem(), *val, nil); err != nil {
873 return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err)
874 }
875 } else {
876 delete(jsonFields, "@type")
877 nestedProto, uerr := json.Marshal(jsonFields)
878 if uerr != nil {
879 return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", uerr)
880 }
881
882 if err = u.unmarshalValue(reflect.ValueOf(m).Elem(), nestedProto, nil); err != nil {
883 return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err)
884 }
885 }
886
887 b, err := proto.Marshal(m)
888 if err != nil {
889 return fmt.Errorf("can't marshal proto %T into Any.Value: %v", m, err)
890 }
891 target.Field(1).SetBytes(b)
892
893 return nil
894 case "Duration":
895 unq, err := unquote(string(inputValue))
896 if err != nil {
897 return err
898 }
899
900 d, err := time.ParseDuration(unq)
901 if err != nil {
902 return fmt.Errorf("bad Duration: %v", err)
903 }
904
905 ns := d.Nanoseconds()
906 s := ns / 1e9
907 ns %= 1e9
908 target.Field(0).SetInt(s)
909 target.Field(1).SetInt(ns)
910 return nil
911 case "Timestamp":
912 unq, err := unquote(string(inputValue))
913 if err != nil {
914 return err
915 }
916
917 t, err := time.Parse(time.RFC3339Nano, unq)
918 if err != nil {
919 return fmt.Errorf("bad Timestamp: %v", err)
920 }
921
922 target.Field(0).SetInt(t.Unix())
923 target.Field(1).SetInt(int64(t.Nanosecond()))
924 return nil
925 case "Struct":
926 var m map[string]json.RawMessage
927 if err := json.Unmarshal(inputValue, &m); err != nil {
928 return fmt.Errorf("bad StructValue: %v", err)
929 }
930 target.Field(0).Set(reflect.ValueOf(map[string]*types.Value{}))
931 for k, jv := range m {
932 pv := &types.Value{}
933 if err := u.unmarshalValue(reflect.ValueOf(pv).Elem(), jv, prop); err != nil {
934 return fmt.Errorf("bad value in StructValue for key %q: %v", k, err)
935 }
936 target.Field(0).SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(pv))
937 }
938 return nil
939 case "ListValue":
940 var s []json.RawMessage
941 if err := json.Unmarshal(inputValue, &s); err != nil {
942 return fmt.Errorf("bad ListValue: %v", err)
943 }
944
945 target.Field(0).Set(reflect.ValueOf(make([]*types.Value, len(s))))
946 for i, sv := range s {
947 if err := u.unmarshalValue(target.Field(0).Index(i), sv, prop); err != nil {
948 return err
949 }
950 }
951 return nil
952 case "Value":
953 ivStr := string(inputValue)
954 if ivStr == "null" {
955 target.Field(0).Set(reflect.ValueOf(&types.Value_NullValue{}))
956 } else if v, err := strconv.ParseFloat(ivStr, 0); err == nil {
957 target.Field(0).Set(reflect.ValueOf(&types.Value_NumberValue{NumberValue: v}))
958 } else if v, err := unquote(ivStr); err == nil {
959 target.Field(0).Set(reflect.ValueOf(&types.Value_StringValue{StringValue: v}))
960 } else if v, err := strconv.ParseBool(ivStr); err == nil {
961 target.Field(0).Set(reflect.ValueOf(&types.Value_BoolValue{BoolValue: v}))
962 } else if err := json.Unmarshal(inputValue, &[]json.RawMessage{}); err == nil {
963 lv := &types.ListValue{}
964 target.Field(0).Set(reflect.ValueOf(&types.Value_ListValue{ListValue: lv}))
965 return u.unmarshalValue(reflect.ValueOf(lv).Elem(), inputValue, prop)
966 } else if err := json.Unmarshal(inputValue, &map[string]json.RawMessage{}); err == nil {
967 sv := &types.Struct{}
968 target.Field(0).Set(reflect.ValueOf(&types.Value_StructValue{StructValue: sv}))
969 return u.unmarshalValue(reflect.ValueOf(sv).Elem(), inputValue, prop)
970 } else {
971 return fmt.Errorf("unrecognized type for Value %q", ivStr)
972 }
973 return nil
974 }
975 }
976
977 if t, ok := target.Addr().Interface().(*time.Time); ok {
978 ts := &types.Timestamp{}
979 if err := u.unmarshalValue(reflect.ValueOf(ts).Elem(), inputValue, prop); err != nil {
980 return err
981 }
982 tt, err := types.TimestampFromProto(ts)
983 if err != nil {
984 return err
985 }
986 *t = tt
987 return nil
988 }
989
990 if d, ok := target.Addr().Interface().(*time.Duration); ok {
991 dur := &types.Duration{}
992 if err := u.unmarshalValue(reflect.ValueOf(dur).Elem(), inputValue, prop); err != nil {
993 return err
994 }
995 dd, err := types.DurationFromProto(dur)
996 if err != nil {
997 return err
998 }
999 *d = dd
1000 return nil
1001 }
1002
1003
1004
1005
1006
1007 if inputValue[0] == '"' && prop != nil && prop.Enum != "" {
1008 vmap := proto.EnumValueMap(prop.Enum)
1009
1010
1011 s := inputValue[1 : len(inputValue)-1]
1012 n, ok := vmap[string(s)]
1013 if !ok {
1014 return fmt.Errorf("unknown value %q for enum %s", s, prop.Enum)
1015 }
1016 if target.Kind() == reflect.Ptr {
1017 target.Set(reflect.New(targetType.Elem()))
1018 target = target.Elem()
1019 }
1020 if targetType.Kind() != reflect.Int32 {
1021 return fmt.Errorf("invalid target %q for enum %s", targetType.Kind(), prop.Enum)
1022 }
1023 target.SetInt(int64(n))
1024 return nil
1025 }
1026
1027 if prop != nil && len(prop.CustomType) > 0 && target.CanAddr() {
1028 if m, ok := target.Addr().Interface().(interface {
1029 UnmarshalJSON([]byte) error
1030 }); ok {
1031 return json.Unmarshal(inputValue, m)
1032 }
1033 }
1034
1035
1036 if targetType.Kind() == reflect.Struct {
1037 var jsonFields map[string]json.RawMessage
1038 if err := json.Unmarshal(inputValue, &jsonFields); err != nil {
1039 return err
1040 }
1041
1042 consumeField := func(prop *proto.Properties) (json.RawMessage, bool) {
1043
1044 fieldNames := acceptedJSONFieldNames(prop)
1045
1046 vOrig, okOrig := jsonFields[fieldNames.orig]
1047 vCamel, okCamel := jsonFields[fieldNames.camel]
1048 if !okOrig && !okCamel {
1049 return nil, false
1050 }
1051
1052 var raw json.RawMessage
1053 if okOrig {
1054 raw = vOrig
1055 delete(jsonFields, fieldNames.orig)
1056 }
1057 if okCamel {
1058 raw = vCamel
1059 delete(jsonFields, fieldNames.camel)
1060 }
1061 return raw, true
1062 }
1063
1064 sprops := proto.GetProperties(targetType)
1065 for i := 0; i < target.NumField(); i++ {
1066 ft := target.Type().Field(i)
1067 if strings.HasPrefix(ft.Name, "XXX_") {
1068 continue
1069 }
1070 valueForField, ok := consumeField(sprops.Prop[i])
1071 if !ok {
1072 continue
1073 }
1074
1075 if err := u.unmarshalValue(target.Field(i), valueForField, sprops.Prop[i]); err != nil {
1076 return err
1077 }
1078 }
1079
1080 if len(jsonFields) > 0 {
1081 for _, oop := range sprops.OneofTypes {
1082 raw, ok := consumeField(oop.Prop)
1083 if !ok {
1084 continue
1085 }
1086 nv := reflect.New(oop.Type.Elem())
1087 target.Field(oop.Field).Set(nv)
1088 if err := u.unmarshalValue(nv.Elem().Field(0), raw, oop.Prop); err != nil {
1089 return err
1090 }
1091 }
1092 }
1093
1094 if len(jsonFields) > 0 {
1095 if ep, ok := target.Addr().Interface().(proto.Message); ok {
1096 for _, ext := range proto.RegisteredExtensions(ep) {
1097 name := fmt.Sprintf("[%s]", ext.Name)
1098 raw, ok := jsonFields[name]
1099 if !ok {
1100 continue
1101 }
1102 delete(jsonFields, name)
1103 nv := reflect.New(reflect.TypeOf(ext.ExtensionType).Elem())
1104 if err := u.unmarshalValue(nv.Elem(), raw, nil); err != nil {
1105 return err
1106 }
1107 if err := proto.SetExtension(ep, ext, nv.Interface()); err != nil {
1108 return err
1109 }
1110 }
1111 }
1112 }
1113 if !u.AllowUnknownFields && len(jsonFields) > 0 {
1114
1115 var f string
1116 for fname := range jsonFields {
1117 f = fname
1118 break
1119 }
1120 return fmt.Errorf("unknown field %q in %v", f, targetType)
1121 }
1122 return nil
1123 }
1124
1125
1126 if targetType.Kind() == reflect.Slice {
1127 if targetType.Elem().Kind() == reflect.Uint8 {
1128 outRef := reflect.New(targetType)
1129 outVal := outRef.Interface()
1130
1131 if _, ok := outVal.(interface {
1132 UnmarshalJSON([]byte) error
1133 }); ok {
1134 if err := json.Unmarshal(inputValue, outVal); err != nil {
1135 return err
1136 }
1137 target.Set(outRef.Elem())
1138 return nil
1139 }
1140
1141
1142
1143
1144 var out []byte
1145 if err := json.Unmarshal(inputValue, &out); err != nil {
1146 return err
1147 }
1148 target.SetBytes(out)
1149 return nil
1150 }
1151
1152 var slc []json.RawMessage
1153 if err := json.Unmarshal(inputValue, &slc); err != nil {
1154 return err
1155 }
1156 if slc != nil {
1157 l := len(slc)
1158 target.Set(reflect.MakeSlice(targetType, l, l))
1159 for i := 0; i < l; i++ {
1160 if err := u.unmarshalValue(target.Index(i), slc[i], prop); err != nil {
1161 return err
1162 }
1163 }
1164 }
1165 return nil
1166 }
1167
1168
1169 if targetType.Kind() == reflect.Map {
1170 var mp map[string]json.RawMessage
1171 if err := json.Unmarshal(inputValue, &mp); err != nil {
1172 return err
1173 }
1174 if mp != nil {
1175 target.Set(reflect.MakeMap(targetType))
1176 for ks, raw := range mp {
1177
1178
1179 var k reflect.Value
1180 if targetType.Key().Kind() == reflect.String {
1181 k = reflect.ValueOf(ks)
1182 } else {
1183 k = reflect.New(targetType.Key()).Elem()
1184 var kprop *proto.Properties
1185 if prop != nil && prop.MapKeyProp != nil {
1186 kprop = prop.MapKeyProp
1187 }
1188 if err := u.unmarshalValue(k, json.RawMessage(ks), kprop); err != nil {
1189 return err
1190 }
1191 }
1192
1193 if !k.Type().AssignableTo(targetType.Key()) {
1194 k = k.Convert(targetType.Key())
1195 }
1196
1197
1198 v := reflect.New(targetType.Elem()).Elem()
1199 var vprop *proto.Properties
1200 if prop != nil && prop.MapValProp != nil {
1201 vprop = prop.MapValProp
1202 }
1203 if err := u.unmarshalValue(v, raw, vprop); err != nil {
1204 return err
1205 }
1206 target.SetMapIndex(k, v)
1207 }
1208 }
1209 return nil
1210 }
1211
1212
1213 isFloat := targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64
1214 if isFloat {
1215 if num, ok := nonFinite[string(inputValue)]; ok {
1216 target.SetFloat(num)
1217 return nil
1218 }
1219 }
1220
1221
1222
1223 isNum := targetType.Kind() == reflect.Int64 || targetType.Kind() == reflect.Uint64 ||
1224 targetType.Kind() == reflect.Int32 || targetType.Kind() == reflect.Uint32 ||
1225 targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64
1226 if isNum && strings.HasPrefix(string(inputValue), `"`) {
1227 inputValue = inputValue[1 : len(inputValue)-1]
1228 }
1229
1230
1231 return json.Unmarshal(inputValue, target.Addr().Interface())
1232 }
1233
1234 func unquote(s string) (string, error) {
1235 var ret string
1236 err := json.Unmarshal([]byte(s), &ret)
1237 return ret, err
1238 }
1239
1240
1241 func jsonProperties(f reflect.StructField, origName bool) *proto.Properties {
1242 var prop proto.Properties
1243 prop.Init(f.Type, f.Name, f.Tag.Get("protobuf"), &f)
1244 if origName || prop.JSONName == "" {
1245 prop.JSONName = prop.OrigName
1246 }
1247 return &prop
1248 }
1249
1250 type fieldNames struct {
1251 orig, camel string
1252 }
1253
1254 func acceptedJSONFieldNames(prop *proto.Properties) fieldNames {
1255 opts := fieldNames{orig: prop.OrigName, camel: prop.OrigName}
1256 if prop.JSONName != "" {
1257 opts.camel = prop.JSONName
1258 }
1259 return opts
1260 }
1261
1262
1263 type errWriter struct {
1264 writer io.Writer
1265 err error
1266 }
1267
1268 func (w *errWriter) write(str string) {
1269 if w.err != nil {
1270 return
1271 }
1272 _, w.err = w.writer.Write([]byte(str))
1273 }
1274
1275
1276
1277
1278
1279
1280
1281
1282 type mapKeys []reflect.Value
1283
1284 func (s mapKeys) Len() int { return len(s) }
1285 func (s mapKeys) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
1286 func (s mapKeys) Less(i, j int) bool {
1287 if k := s[i].Kind(); k == s[j].Kind() {
1288 switch k {
1289 case reflect.String:
1290 return s[i].String() < s[j].String()
1291 case reflect.Int32, reflect.Int64:
1292 return s[i].Int() < s[j].Int()
1293 case reflect.Uint32, reflect.Uint64:
1294 return s[i].Uint() < s[j].Uint()
1295 }
1296 }
1297 return fmt.Sprint(s[i].Interface()) < fmt.Sprint(s[j].Interface())
1298 }
1299
1300
1301
1302
1303 func checkRequiredFields(pb proto.Message) error {
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314 if _, ok := pb.(isWkt); ok {
1315 return nil
1316 }
1317
1318 v := reflect.ValueOf(pb)
1319
1320 if v.Kind() != reflect.Ptr {
1321 return nil
1322 }
1323 v = v.Elem()
1324 if v.Kind() != reflect.Struct {
1325 return nil
1326 }
1327
1328 for i := 0; i < v.NumField(); i++ {
1329 field := v.Field(i)
1330 sfield := v.Type().Field(i)
1331
1332 if sfield.PkgPath != "" {
1333
1334 continue
1335 }
1336
1337 if strings.HasPrefix(sfield.Name, "XXX_") {
1338 continue
1339 }
1340
1341
1342
1343 if sfield.Tag.Get("protobuf_oneof") != "" {
1344 if field.Kind() != reflect.Interface {
1345 continue
1346 }
1347 v := field.Elem()
1348 if v.Kind() != reflect.Ptr || v.IsNil() {
1349 continue
1350 }
1351 v = v.Elem()
1352 if v.Kind() != reflect.Struct || v.NumField() < 1 {
1353 continue
1354 }
1355 field = v.Field(0)
1356 sfield = v.Type().Field(0)
1357 }
1358
1359 protoTag := sfield.Tag.Get("protobuf")
1360 if protoTag == "" {
1361 continue
1362 }
1363 var prop proto.Properties
1364 prop.Init(sfield.Type, sfield.Name, protoTag, &sfield)
1365
1366 switch field.Kind() {
1367 case reflect.Map:
1368 if field.IsNil() {
1369 continue
1370 }
1371
1372 keys := field.MapKeys()
1373 for _, k := range keys {
1374 v := field.MapIndex(k)
1375 if err := checkRequiredFieldsInValue(v); err != nil {
1376 return err
1377 }
1378 }
1379 case reflect.Slice:
1380
1381 if !prop.Repeated {
1382 if prop.Required && field.IsNil() {
1383 return fmt.Errorf("required field %q is not set", prop.Name)
1384 }
1385 continue
1386 }
1387
1388
1389 if field.IsNil() {
1390 continue
1391 }
1392
1393 for i := 0; i < field.Len(); i++ {
1394 v := field.Index(i)
1395 if err := checkRequiredFieldsInValue(v); err != nil {
1396 return err
1397 }
1398 }
1399 case reflect.Ptr:
1400 if field.IsNil() {
1401 if prop.Required {
1402 return fmt.Errorf("required field %q is not set", prop.Name)
1403 }
1404 continue
1405 }
1406 if err := checkRequiredFieldsInValue(field); err != nil {
1407 return err
1408 }
1409 }
1410 }
1411
1412
1413 for _, ext := range proto.RegisteredExtensions(pb) {
1414 if !proto.HasExtension(pb, ext) {
1415 continue
1416 }
1417 ep, err := proto.GetExtension(pb, ext)
1418 if err != nil {
1419 return err
1420 }
1421 err = checkRequiredFieldsInValue(reflect.ValueOf(ep))
1422 if err != nil {
1423 return err
1424 }
1425 }
1426
1427 return nil
1428 }
1429
1430 func checkRequiredFieldsInValue(v reflect.Value) error {
1431 if v.Type().Implements(messageType) {
1432 return checkRequiredFields(v.Interface().(proto.Message))
1433 }
1434 return nil
1435 }
1436
View as plain text