// Copyright 2012-2018 The NATS Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package builtin import ( "encoding/json" "strings" ) // JsonEncoder is a JSON Encoder implementation for EncodedConn. // This encoder will use the builtin encoding/json to Marshal // and Unmarshal most types, including structs. type JsonEncoder struct { // Empty } // Encode func (je *JsonEncoder) Encode(subject string, v interface{}) ([]byte, error) { b, err := json.Marshal(v) if err != nil { return nil, err } return b, nil } // Decode func (je *JsonEncoder) Decode(subject string, data []byte, vPtr interface{}) (err error) { switch arg := vPtr.(type) { case *string: // If they want a string and it is a JSON string, strip quotes // This allows someone to send a struct but receive as a plain string // This cast should be efficient for Go 1.3 and beyond. str := string(data) if strings.HasPrefix(str, `"`) && strings.HasSuffix(str, `"`) { *arg = str[1 : len(str)-1] } else { *arg = str } case *[]byte: *arg = data default: err = json.Unmarshal(data, arg) } return }