// +build json // 仅当编译时带 -tags=json 参数时才生效

package jsonutil

import (
	"encoding/json"
	"strings"
)

var (
	Marshal = func(v interface{}) ([]byte, error) {
		if nil == v {
			return nil, nil
		} else if m, ok := v.(json.Marshaler); ok {
			return m.MarshalJSON()
		} else {
			return json.Marshal(v)
		}
	}
	Unmarshal       = json.Unmarshal
	MarshalToString = func(v interface{}) (string, error) {
		if nil == v {
			return "", nil
		} else if m, ok := v.(json.Marshaler); ok {
			data, err := m.MarshalJSON()
			if nil != err {
				return "", err
			}
			return string(data), err
		} else {
			data, err := json.Marshal(v)
			if nil != err {
				return "", err
			}
			return string(data), nil
		}
	}
	UnmarshalFromString = func(str string, v interface{}) error {
		str = strings.TrimSpace(str)
		if str == "" {
			return nil
		}

		data := []byte(str)
		return json.Unmarshal(data, v)
	}
	MarshalIndent = json.MarshalIndent
	NewDecoder    = json.NewDecoder
	NewEncoder    = json.NewEncoder
)