简介
简单的介绍一下使用go的json库,将json字符串反序列化成接口中指定的实现类
代码如下
package usejson
type ExamInterface interface {
CheckRule(data any) bool
}
type IntStru struct {
DefalutVal int `json:"defalut_val"`
Max int `json:"max"`
Min int `json:"min"`
}
func (i IntStru) CheckRule(data any) bool {
if data.(int) < i.Max && data.(int) > i.Min {
return true
}
return false
}
func (i IntStru) New() {
}
type StringStru struct {
DefaultVal string `json:"default_val"`
Len int `json:"len"`
}
func (s StringStru) CheckRule(data any) bool {
if len(data.(string)) > s.Len {
return false
}
return true
}
func (s StringStru) New() {
}
测试用例
package usejson
import (
"encoding/json"
"fmt"
"testing"
)
func TestRule(t *testing.T) {
val := "{\"int\":{\"defalut_val\":0,\"max\":500,\"min\":30}}"
var exam = map[string]interface{}{}
err := json.Unmarshal([]byte(val), &exam)
if err != nil {
panic(err)
}
if val, ok := exam["int"]; ok {
data, _ := json.Marshal(val)
intr := &IntStru{}
json.Unmarshal(data, intr)
fmt.Println(intr.CheckRule(3))
}
val = "{\"string\":{\"default_val\":\"\",\"len\":3}}"
err = json.Unmarshal([]byte(val), &exam)
if err != nil {
panic(err)
}
if val, ok := exam["string"]; ok {
data, _ := json.Marshal(val)
intr := &StringStru{}
json.Unmarshal(data, intr)
fmt.Println(intr.CheckRule("333"))
}
}
func TestMashal(t *testing.T) {
s := StringStru{Len: 3}
data, _ := json.Marshal(s)
fmt.Println(string(data))
i := IntStru{Max: 500, Min: 30}
data, _ = json.Marshal(i)
fmt.Println(string(data))
}
总结
其实主体逻辑在测试用例中,根据json字符串中特定字符串确定是将json串解析成何种子类,逻辑比较简单。