func (v Engine) IsJSON(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		if !zjson.Valid(v.value) {
			v.err = setError(&v, "格式不正确", customError...)
			return v
		}
		return v
	})
}
IsJSON valid json format
package zvalid
import (
	"fmt"
	"net"
	"strconv"
	"strings"
	"unicode"
	"golang.org/x/crypto/bcrypt"
	"github.com/sohaha/zlsgo/zjson"
	"github.com/sohaha/zlsgo/zstring"
)
func (v Engine) IsBool(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		if _, err := strconv.ParseBool(v.value); err != nil {
			v.err = setError(&v, "必须是布尔值", customError...)
		}
		return v
	})
}
func (v Engine) IsLower(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		for _, rv := range v.value {
			if !unicode.IsLower(rv) {
				v.err = setError(&v, "必须是小写字母", customError...)
				return v
			}
		}
		return v
	})
}
func (v Engine) IsUpper(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		for _, rv := range v.value {
			if !unicode.IsUpper(rv) {
				v.err = setError(&v, "必须是大写字母", customError...)
				return v
			}
		}
		return v
	})
}
func (v Engine) IsLetter(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		for _, rv := range v.value {
			if !unicode.IsLetter(rv) {
				v.err = setError(&v, "必须是字母", customError...)
				return v
			}
		}
		return v
	})
}
func (v Engine) IsNumber(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		if _, err := strconv.Atoi(v.value); err != nil {
			v.err = setError(&v, "必须是数字", customError...)
		}
		return v
	})
}
func (v Engine) IsLowerOrDigit(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		for _, rv := range v.value {
			if !unicode.IsLower(rv) && !unicode.IsDigit(rv) {
				v.err = setError(&v, "必须是小写字母或数字", customError...)
				return v
			}
		}
		return v
	})
}
func (v Engine) IsUpperOrDigit(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		for _, rv := range v.value {
			if !unicode.IsUpper(rv) && !unicode.IsDigit(rv) {
				v.err = setError(&v, "必须是大写字母或数字", customError...)
				return v
			}
		}
		return v
	})
}
func (v Engine) IsLetterOrDigit(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		for _, rv := range v.value {
			if !unicode.IsLetter(rv) && !unicode.IsDigit(rv) {
				v.err = setError(&v, "必须是字母或数字", customError...)
				return v
			}
		}
		return v
	})
}
func (v Engine) IsChinese(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		for _, rv := range v.value {
			if !unicode.Is(unicode.Scripts["Han"], rv) {
				v.err = setError(&v, "必须是中文", customError...)
				return v
			}
		}
		return v
	})
}
func (v Engine) IsMobile(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		if !zstring.RegexMatch(`^1[\d]{10}$`, v.value) {
			v.err = setError(&v, "格式不正确", customError...)
			return v
		}
		return v
	})
}
func (v Engine) IsMail(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		errMsg := setError(&v, "格式不正确", customError...)
		emailSlice := strings.Split(v.value, "@")
		if len(emailSlice) != 2 {
			v.err = errMsg
			return v
		}
		if emailSlice[0] == "" || emailSlice[1] == "" {
			v.err = errMsg
			return v
		}
		for k, rv := range emailSlice[0] {
			if k == 0 && !unicode.IsLetter(rv) && !unicode.IsDigit(rv) {
				v.err = errMsg
				return v
			} else if !unicode.IsLetter(rv) && !unicode.IsDigit(rv) && rv != '@' && rv != '.' && rv != '_' && rv != '-' {
				v.err = errMsg
				return v
			}
		}
		domainSlice := strings.Split(emailSlice[1], ".")
		if len(domainSlice) < 2 {
			v.err = errMsg
			return v
		}
		domainSliceLen := len(domainSlice)
		for i := 0; i < domainSliceLen; i++ {
			for k, rv := range domainSlice[i] {
				if i != domainSliceLen-1 && k == 0 && !unicode.IsLetter(rv) && !unicode.IsDigit(rv) {
					v.err = errMsg
					return v
				} else if !unicode.IsLetter(rv) && !unicode.IsDigit(rv) && rv != '.' && rv != '_' && rv != '-' {
					v.err = errMsg
					return v
				} else if i == domainSliceLen-1 && !unicode.IsLetter(rv) {
					v.err = errMsg
					return v
				}
			}
		}
		return v
	})
}
func (v Engine) IsURL(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		if len(v.value) < 10 || !(strings.HasPrefix(v.value, "https://") || strings.HasPrefix(v.value, "http://")) {
			v.err = setError(&v, "格式不正确", customError...)
			return v
		}
		return v
	})
}
func (v Engine) IsIP(customError ...string) Engine {
	return pushQueue(v, func(v Engine) Engine {
		if ignore(&v) {
			return v
		}
		if net.ParseIP(v.value) == nil {
			v.err = setError(&v, "格式不正确", customError...)
			return v
		}
		return v
	})
}