golang原生的json解析库,有时候用起来一点都不方便,自己简单封装了一下,看下测试用例
var jsonStr2 = `{"int":1,"bool":false,"string":"123","object":{"key":111}}` func TestJsonObject(t *testing.T) { object, err := NewJsonObject(jsonStr2) if err != nil { fmt.Println(err) return } fmt.Println(object.GetFloat64("int")) fmt.Println(object.GetBool("bool")) fmt.Println(object.GetString("string")) // 想要获取内层数据,中间加点即可 fmt.Println(object.GetFloat64("object.key")) }
测试结果
1 <nil> false <nil> 123 <nil> 111 <nil>
这里贴出代码:
package jsonlib import ( "encoding/json" "errors" "strings" ) var ( ErrNil = errors.New("error key not exist") // key所对应的值不存在 ErrFormat = errors.New("error formart") // 类型转换错误 ) type JsonObject struct { data map[string]interface{} } // NewJsonObject 创建一个json对象 func NewJsonObject(str string) (*JsonObject, error) { jsonObject := new(JsonObject) err := json.Unmarshal([]byte(str), &jsonObject.data) if err != nil { return nil, err } return jsonObject, nil } func (o *JsonObject) getValue(key string) (interface{}, error) { m := o.data keys := strings.Split(key, ".") var ( value interface{} ok = false ) for i := 0; i < len(keys)-1; i++ { value, ok = m[keys[i]] if !ok { return nil, ErrNil } m, ok = value.(map[string]interface{}) if !ok { return nil, ErrFormat } } value, ok = m[keys[len(keys)-1]] if !ok { return nil, ErrNil } return value, nil } // GetBool 获取Bool值 func (o *JsonObject) GetBool(key string) (bool, error) { value, err := o.getValue(key) if err != nil { return false, err } result, ok := value.(bool) if !ok { return false, ErrFormat } return result, nil } // GetFloat64 获取float64值 func (o *JsonObject) GetFloat64(key string) (float64, error) { value, err := o.getValue(key) if err != nil { return 0, err } result, ok := value.(float64) if !ok { return 0, ErrFormat } return result, nil } // GetString 获取string值 func (o *JsonObject) GetString(key string) (string, error) { value, err := o.getValue(key) if err != nil { return "", err } result, ok := value.(string) if !ok { return "", ErrFormat } return result, nil } // GetBool 获取Bool值 func GetBool(str string, key string) (bool, error) { object, err := NewJsonObject(str) if err != nil { return false, err } return object.GetBool(key) } // GetFloat64 获取float64值 func GetFloat64(str string, key string) (float64, error) { object, err := NewJsonObject(str) if err != nil { return 0, err } return object.GetFloat64(key) } // GetString 获取string值 func GetString(str string, key string) (string, error) { object, err := NewJsonObject(str) if err != nil { return "", err } return object.GetString(key) }
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
程序员编程交流QQ群:805358732
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!