前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang json 序列化、反序列化 字符串反序列化成 map[string]interface{}

golang json 序列化、反序列化 字符串反序列化成 map[string]interface{}

作者头像
一个会写诗的程序员
发布2022-06-29 13:39:43
1.5K0
发布2022-06-29 13:39:43
举报
文章被收录于专栏:一个会写诗的程序员的博客

json.Unmarshl 反序列化 : 将 json 字符串转为结构体

代码语言:javascript
复制
func Unmarshal(data []byte, v interface{}) error 

需求:将 json 字符串转为结构体 1)预先定义json对应的结构体类型; 2)调用 json.Unmarshl

代码语言:javascript
复制
func main() {
    // 这里反引号表示不转意,即为string类型
    resp := `{"code":0,"message":"success","grades":[{"gradeClass":"一年级","Score":{"chinese":99,"english":88}},{"gradeClass":"二年级","Score":{"chinese":100,"english":98}}]}`
    var stu Student
    err := json.Unmarshal([]byte(resp), &stu)
    if err != nil {
        log.Println(err)
    }
    log.Println(stu)
    // 2021/08/12 23:37:19 {0 success [{一年级 {99 88}} {二年级 {100 98}}]}
}

type Student struct {
    Code    int         `json:"code"`    // 使用tag,表示对应json的字段名
    Message string      `json:"message"`
    Grades  []GradeType `json:"grades"`  // 结构体类数组
}
type GradeType struct {
    GradeClass string `json:"gradeClass"`
    Score      ScoreType
}
type ScoreType struct {
    Chinese int `json:"chinese"`
    English int `json:"english"`
}

json 字符串反序列化成 map

代码语言:javascript
复制
    // 强转interface类型到string类型(注意: 不是 convert.ToJSONString)
    wordCloudJson := convert.ToString(data[0]["word_cloud_json"])

    words := make(map[string]interface{})
    err = json.Unmarshal([]byte(wordCloudJson), &words)
    if err != nil {
        logu.CtxError(ctx, error_code.ProcessError, "GetBrandWordCloud Unmarshal", "wordCloudJson:%v,error: %v", wordCloudJson, err)
        return result, err
    }

    for k, v := range words {
        result = append(result, &competition_detail.BrandWord{
            ProductPropertyValue: k,
            ProductFrequency:     convert.ToInt64(v),
        })
    }

    // 降序取 TOP 100
    top(&result, 100)

其中,func ToString(i interface{}) string 代码:

代码语言:javascript
复制
// ToString 强转interface类型到string类型
func ToString(i interface{}) string {
    v, _ := ToStringE(i)
    return v
}



// ToStringE 强转interface类型到string, 支持错误返回值
func ToStringE(i interface{}) (string, error) {
    i = indirectToStringerOrError(i)

    switch s := i.(type) {
    case string:
        return s, nil
    case bool:
        return strconv.FormatBool(s), nil
    case float64:
        return strconv.FormatFloat(s, 'f', -1, 64), nil
    case float32:
        return strconv.FormatFloat(float64(s), 'f', -1, 32), nil
    case int:
        return strconv.Itoa(s), nil
    case int64:
        return strconv.FormatInt(s, 10), nil
    case int32:
        return strconv.Itoa(int(s)), nil
    case int16:
        return strconv.FormatInt(int64(s), 10), nil
    case int8:
        return strconv.FormatInt(int64(s), 10), nil
    case uint:
        return strconv.FormatInt(int64(s), 10), nil
    case uint64:
        return strconv.FormatInt(int64(s), 10), nil
    case uint32:
        return strconv.FormatInt(int64(s), 10), nil
    case uint16:
        return strconv.FormatInt(int64(s), 10), nil
    case uint8:
        return strconv.FormatInt(int64(s), 10), nil
    case []byte:
        return string(s), nil
    case template.HTML:
        return string(s), nil
    case template.URL:
        return string(s), nil
    case template.JS:
        return string(s), nil
    case template.CSS:
        return string(s), nil
    case template.HTMLAttr:
        return string(s), nil
    case nil:
        return "", nil
    case fmt.Stringer:
        return s.String(), nil
    case error:
        return s.Error(), nil
    default:
        v := reflect.ValueOf(i)
        if method, ok := reflect.TypeOf(i).MethodByName("String"); ok && method.Type.NumIn() == 0 &&
            method.Type.NumOut() == 1 && method.Type.Out(0).Kind() == reflect.String {
            return method.Func.Call([]reflect.Value{v})[0].String(), nil
        }
        switch v.Kind() {
        case reflect.Func:
            fullName := runtime.FuncForPC(v.Pointer()).Name()
            ss := strings.Split(fullName, ".")
            if len(ss) > 0 {
                return ss[len(ss)-1], nil
            } else {
                return fullName, nil
            }
        case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
            return ToStringE(v.Uint())
        case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
            return ToStringE(v.Int())
        case reflect.Float64, reflect.Float32:
            return ToStringE(v.Float())
        case reflect.Bool:
            return ToStringE(v.Bool())
        case reflect.String:
            return v.String(), nil
        }
        return "", fmt.Errorf("unable to cast %#v of type %T to string", i, i)
    }
}

参考资料

https://blog.csdn.net/Sunny_Future/article/details/119656822

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • json.Unmarshl 反序列化 : 将 json 字符串转为结构体
  • json 字符串反序列化成 map
  • 参考资料
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档