github.com/algorand/go-algorand-sdk@v1.24.0/encoding/json/json.go (about) 1 package json 2 3 import ( 4 "io" 5 6 "github.com/algorand/go-codec/codec" 7 ) 8 9 // CodecHandle is used to instantiate JSON encoders and decoders 10 // with our settings (canonical, paranoid about decoding errors) 11 var CodecHandle *codec.JsonHandle 12 13 // LenientCodecHandle is used to instantiate msgpack encoders for the REST API. 14 var LenientCodecHandle *codec.JsonHandle 15 16 // init configures our json encoder and decoder 17 func init() { 18 CodecHandle = new(codec.JsonHandle) 19 CodecHandle.ErrorIfNoField = true 20 CodecHandle.ErrorIfNoArrayExpand = true 21 CodecHandle.Canonical = true 22 CodecHandle.RecursiveEmptyCheck = true 23 CodecHandle.Indent = 2 24 CodecHandle.HTMLCharsAsIs = true 25 26 LenientCodecHandle = new(codec.JsonHandle) 27 LenientCodecHandle.ErrorIfNoField = false 28 LenientCodecHandle.ErrorIfNoArrayExpand = true 29 LenientCodecHandle.Canonical = true 30 LenientCodecHandle.RecursiveEmptyCheck = true 31 LenientCodecHandle.Indent = 2 32 LenientCodecHandle.HTMLCharsAsIs = true 33 } 34 35 // Encode returns a json-encoded byte buffer for a given object 36 func Encode(obj interface{}) []byte { 37 var b []byte 38 enc := codec.NewEncoderBytes(&b, CodecHandle) 39 enc.MustEncode(obj) 40 return b 41 } 42 43 // Decode attempts to decode a json-encoded byte buffer into an 44 // object instance pointed to by objptr 45 func Decode(b []byte, objptr interface{}) error { 46 dec := codec.NewDecoderBytes(b, CodecHandle) 47 err := dec.Decode(objptr) 48 if err != nil { 49 return err 50 } 51 return nil 52 } 53 54 // LenientDecode attempts to decode a json-encoded byte buffer into an 55 // object instance pointed to by objptr 56 func LenientDecode(b []byte, objptr interface{}) error { 57 dec := codec.NewDecoderBytes(b, LenientCodecHandle) 58 err := dec.Decode(objptr) 59 if err != nil { 60 return err 61 } 62 return nil 63 } 64 65 // NewDecoder returns a json decoder 66 func NewDecoder(r io.Reader) *codec.Decoder { 67 return codec.NewDecoder(r, CodecHandle) 68 } 69 70 // NewLenientDecoder returns a json decoder 71 func NewLenientDecoder(r io.Reader) *codec.Decoder { 72 return codec.NewDecoder(r, LenientCodecHandle) 73 }