@@ -32,6 +32,62 @@ type Field struct {
3232 Value Value
3333}
3434
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 true
75+ }
76+ if err := valueMarshalJSONTo (enc , v ); err != nil {
77+ iterErr = err
78+ return true
79+ }
80+ return false
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+
3591// FieldList is a list of key-value pairs. Each field is expected to
3692// have a different name.
3793type FieldList []Field
@@ -42,7 +98,7 @@ func (fl *FieldList) MarshalJSONTo(enc *jsontext.Encoder) error {
4298 if err := enc .WriteToken (jsontext .String (f .Name )); err != nil {
4399 return err
44100 }
45- if err := json . MarshalEncode (enc , f .Value . Unstructured (), json . Deterministic ( true ) ); err != nil {
101+ if err := valueMarshalJSONTo (enc , f .Value ); err != nil {
46102 return err
47103 }
48104 }
0 commit comments