@@ -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  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+ 
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