@@ -32,6 +32,62 @@ type Field struct {
32
32
Value Value
33
33
}
34
34
35
+ type MarshalValue struct {
36
+ Value * Value
37
+ }
38
+
39
+ func (mv MarshalValue ) MarshalJSONTo (enc * jsontext.Encoder ) error {
40
+ return valueMarshalJSONTo (enc , * mv .Value )
41
+ }
42
+
43
+ func valueMarshalJSONTo (enc * jsontext.Encoder , v Value ) error {
44
+ switch {
45
+ case v .IsNull ():
46
+ return enc .WriteToken (jsontext .Null )
47
+ case v .IsFloat ():
48
+ return enc .WriteToken (jsontext .Float (v .AsFloat ()))
49
+ case v .IsInt ():
50
+ return enc .WriteToken (jsontext .Int (v .AsInt ()))
51
+ case v .IsString ():
52
+ return enc .WriteToken (jsontext .String (v .AsString ()))
53
+ case v .IsBool ():
54
+ return enc .WriteToken (jsontext .Bool (v .AsBool ()))
55
+ case v .IsList ():
56
+ if err := enc .WriteToken (jsontext .BeginArray ); err != nil {
57
+ return err
58
+ }
59
+ list := v .AsList ()
60
+ for i := 0 ; i < list .Length (); i ++ {
61
+ if err := valueMarshalJSONTo (enc , list .At (i )); err != nil {
62
+ return err
63
+ }
64
+ }
65
+ return enc .WriteToken (jsontext .EndArray )
66
+ case v .IsMap ():
67
+ if err := enc .WriteToken (jsontext .BeginObject ); err != nil {
68
+ return err
69
+ }
70
+ var iterErr error
71
+ v .AsMap ().Iterate (func (k string , v Value ) bool {
72
+ if err := enc .WriteToken (jsontext .String (k )); err != nil {
73
+ iterErr = err
74
+ return false
75
+ }
76
+ if err := valueMarshalJSONTo (enc , v ); err != nil {
77
+ iterErr = err
78
+ return false
79
+ }
80
+ return true
81
+ })
82
+ if iterErr != nil {
83
+ return iterErr
84
+ }
85
+ return enc .WriteToken (jsontext .EndObject )
86
+ default :
87
+ return json .MarshalEncode (enc , v .Unstructured (), json .Deterministic (true ))
88
+ }
89
+ }
90
+
35
91
// FieldList is a list of key-value pairs. Each field is expected to
36
92
// have a different name.
37
93
type FieldList []Field
@@ -42,7 +98,7 @@ func (fl *FieldList) MarshalJSONTo(enc *jsontext.Encoder) error {
42
98
if err := enc .WriteToken (jsontext .String (f .Name )); err != nil {
43
99
return err
44
100
}
45
- if err := json . MarshalEncode (enc , f .Value . Unstructured (), json . Deterministic ( true ) ); err != nil {
101
+ if err := valueMarshalJSONTo (enc , f .Value ); err != nil {
46
102
return err
47
103
}
48
104
}
0 commit comments