美文网首页
go解析自由格式的yaml和json文件

go解析自由格式的yaml和json文件

作者: 深圳都这么冷 | 来源:发表于2022-07-15 16:03 被阅读0次

1. 从string到json格式的golang对象

首先将合法的json格式string或者yaml格式string解析为golang对象

  • json格式为:
import "encoding/json"
var json_data interface{}
json.Unmarshal([]byte(json_str), &json_data)

json_str 为合法的json格式字符串变量或常量
interface{}「空接口」代表任意类型的对象

  • yaml格式为:
import (
    yaml "gopkg.in/yaml.v3"
)
var json_data interface{}
yaml.Unmarshal([]byte(yaml_str), &json_data)

yaml_str 为合法的yaml格式字符串变量或常量

2. 从golang对象中根据路径提取值

路径格式点分割的键,所以需要一个键是数字时转化为数组下标取值的操作

import "unicode"
func isdigit(s string) bool {
    for _, r := range s {
        if !unicode.IsDigit(r) {
            return false
        }
    }
    return true
}

定义一个函数递归根据路径选择值,注意没有异常处理

import "strconv"

func getIn(obj interface{}, path []string) interface{} {
    if len(path) == 0 {
        return obj
    }
    var key = path[0]

    if isdigit(key) {
        i, _ := strconv.ParseInt(key, 10, 32)
        t := obj.([]interface{})
        return getIn(t[i], path[1:])
    } else {
        t := obj.(map[string]interface{})
        return getIn(t[key], path[1:])
    }
}

定义一个入口函数,键使用字符串形式传递

func jsonGet(json_obj interface{}, key string) interface{} {
    if key == "" {
        return json_obj
    }
    return getIn(json_obj, strings.Split(key, "."))
}

以下为main函数,使用实例


func main() {
    var json_str string = `{
        "name": {"first": "Tom", "last": "Anderson"},
        "age":37,
        "children": ["Sara","Alex","Jack"],
        "fav.movie": "Deer Hunter",
        "friends": [
          {"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
          {"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
          {"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
        ]
      }
    `
    var json_data interface{}
    json.Unmarshal([]byte(json_str), &json_data)
    fmt.Println(jsonGet(json_data, "name.last"))
    fmt.Println(jsonGet(json_data, "friends.1.nets.1"))
}

3.完整代码

// main.go
package main

import (
    "encoding/json"
    "fmt"
    "strconv"
    "strings"
    "unicode"
)

func isdigit(s string) bool {
    for _, r := range s {
        if !unicode.IsDigit(r) {
            return false
        }
    }
    return true
}

func getIn(obj interface{}, path []string) interface{} {
    if len(path) == 0 {
        return obj
    }
    var key = path[0]

    if isdigit(key) {
        i, _ := strconv.ParseInt(key, 10, 32)
        t := obj.([]interface{})
        return getIn(t[i], path[1:])
    } else {
        t := obj.(map[string]interface{})
        return getIn(t[key], path[1:])
    }
}

func jsonGet(json_obj interface{}, key string) interface{} {
    if key == "" {
        return json_obj
    }
    return getIn(json_obj, strings.Split(key, "."))
}

func main() {
    var json_str string = `{
        "name": {"first": "Tom", "last": "Anderson"},
        "age":37,
        "children": ["Sara","Alex","Jack"],
        "fav.movie": "Deer Hunter",
        "friends": [
          {"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
          {"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
          {"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
        ]
      }
    `
    var json_data interface{}
    json.Unmarshal([]byte(json_str), &json_data)
    fmt.Println(jsonGet(json_data, "name.last"))
    fmt.Println(jsonGet(json_data, "friends.1.nets.1"))
}

  • 运行
$ go run main.go
Anderson
tw

更多介绍

有很多开源库也可以处理类似自由结构的json数据,下面列几个供参考

相关文章

  • go解析自由格式的yaml和json文件

    1. 从string到json格式的golang对象 首先将合法的json格式string或者yaml格式stri...

  • beego配置

    beego 目前支持 INI、XML、JSON、YAML 格式的配置文件解析,但是默认采用了 INI 格式解析,用...

  • 用例组织

    HttpRunner 的测试用例支持两种文件格式:YAML 和 JSON。JSON 和 YAML 格式的测试用例完...

  • golang yaml与json配置文件互转

    在java中可利用snakeyaml库进行yaml与json配置文件格式互转,原理就是yaml解析为map对象,再...

  • JSON Schema辅助工具

    JSON在线解析工具(功能包括:JSON格式化、压缩、验证格式、JSON转XML、CSV、YAML),地址如下:h...

  • Yaml格式文件解析

    yaml文件格式解析直接解析比较费劲一般就是这样: 第二种方式就是转换成json ,利用json的优势直接转换成对...

  • k8s 之 yaml文件详解

    1.k8s支持的文件格式 Kubernetes支持YAML和JSON格式管理资源对象JSON格式:主要用于api接...

  • Flutter pubspec.yaml配置文件说明

    YAML文件 YAML 是专门用来写配置文件的语言,有自己相应的语法,非常简洁和强大,远比 JSON 格式方便。详...

  • YAML文件编辑规范及注意点

    YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。 本文介绍 YAML 的语法,以 ...

  • YAML文件编辑规范及注意点

    YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。 本文介绍 YAML 的语法,以 ...

网友评论

      本文标题:go解析自由格式的yaml和json文件

      本文链接:https://www.haomeiwen.com/subject/vypqirtx.html