GoLand解析json获取指定字段内容

wangcheng · 2021-05-26 15:40:21 · 3638 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2021-05-26 15:40:21 的文章,其中的信息可能已经有所发展或是发生改变。

根据字节切片动态解析json指定字段,初学go可以相互多交流,不妥之处请留言说明,我会及时改正

data.json

{
    "basic_info":{
        "upload_date":"2021-04-25 14:17:05.974168",
        "device_id":"AUTH",
        "tss":{
            "date":"2021",
            "system_version":{
                "system":"1.7.1",
                "plug":"1.7.3",
                "patch":"1.7.22"
            }
        }
    }
}

code.go

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

/**
 * 获取json字符串中指定字段内容  ioutil.ReadFile()读取字节切片
 * @param    bytes    json字符串字节数组
 * @param    field    可变参数,指定字段
 */
func getJsonField(bytes []byte, field ...string) []byte {
    if len(field) < 1 {
        fmt.Printf("At least two parameters are required.")
        return nil
    }

    //将字节切片映射到指定map上  key:string类型,value:interface{}  类型能存任何数据类型
    var mapObj map[string]interface{}
    json.Unmarshal(bytes, &mapObj)
    var tmpObj interface{}
    tmpObj = mapObj
    for i := 0; i < len(field); i++ {
        tmpObj = tmpObj.(map[string]interface{})[field[i]]
        if tmpObj == nil {
            fmt.Printf("No field specified: %s ", field[i])
            return nil
        }
    }

    result, err := json.Marshal(tmpObj)
    if err != nil {
        fmt.Print(err)
        return nil
    }
    return result
}

func main() {
    bytes, _ := ioutil.ReadFile("/tmp/data.json")
    s := getJsonField(bytes, "basic_info", "tss")
    fmt.Println(string(s))
}

结果输出

root@Sangfor:/tmp/go_code# go run code.go 
{"date":"2021","system_version":{"patch":"1.7.22","plug":"1.7.3","system":"1.7.1"}}

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3638 次点击  
加入收藏 微博
3 回复  |  直到 2021-06-05 15:36:07
net_pioneer
net_pioneer · #1 · 4年之前

tmpObj = tmpObj.(map[string]interface{})[field[i]] 不太明白这句话的语法,tmpObj是一个接口类型,这么写是什么意思?赐教

stu2162583
stu2162583 · #2 · 4年之前
net_pioneernet_pioneer #1 回复

tmpObj = tmpObj.(map[string]interface{})[field[i]] 不太明白这句话的语法,tmpObj是一个接口类型,这么写是什么意思?赐教

搜go类型断言

wangcheng
wangcheng · #3 · 4年之前

@net_pioneer 1、强制类型转换 2、tmpObj是一个接口类型 是为了同时支持接受map 和 interface两种变量类型赋值

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传