将json字符串解组到具有结构本身一个元素的结构

Udit Bhardwaj:

我是初学者,尝试解组以下json字符串

[{
    "db": {
        "url": "mongodb://localhost",
        "port": "27000",
        "uname": "",
        "pass": "",
        "authdb": "",
        "replicas": [
            {
                "rs01": {
                    "url":"mongodb://localhost",
                    "port": "27001",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            },
            {
                "rs02": {
                    "url":"mongodb://localhost",
                    "port": "27002",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            }
        ]
    }
}]

这是结构

type DBS struct {
    URL      string `json:url`
    Port     string `json:port`
    Uname    string `json:uname`
    Pass     string `json:pass`
    Authdb   string `json:authdb`
    Replicas []DBS   `json:replicas`
}

这是功能

func loadConfigs() []DBS {
    var config []DBS
    raw, err := ioutil.ReadFile("./config.json")
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    json.Unmarshal(raw, &config)
    return config
}

该函数正在返回

{     []}
icza:

您的JSON输入不是的一部分DBS,因为还有另一个JSON对象包装器,并且值DBS属于属性"db"

更深入地讲,"replicaps"是一个JSON数组,其中的对象持有不同的键,其值可由表示DBS

因此,要完全描述JSON,您需要某种“动态”类型。例如,地图就是这种动态类型。

因此,您的原始JSON输入可以使用类型完全建模[]map[string]DBS这是一张地图,因为您的JSON输入包含一个JSON数组。映射键可以对任何属性名称进行建模,并且值是由DBSstruct 建模的JSON对象

请参见下面的示例,该示例完全解析JSON输入:

type DBS struct {
    URL      string           `json:"url"`
    Port     string           `json:"port"`
    Uname    string           `json:"uname"`
    Pass     string           `json:"pass"`
    Authdb   string           `json:"authdb"`
    Replicas []map[string]DBS `json:"replicas"`
}

func main() {
    var dbs []map[string]DBS
    if err := json.Unmarshal([]byte(src), &dbs); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", dbs)
}

注意正确的标记语法(例如json:"url")。

输出(在Go Playground上尝试):

[map[db:{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}] map[rs02:{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}]]}]]

请注意,您可以进一步对始终为的第一个级别建模"db",并且我们可以切换到指针(在第一个示例中我使用了非指针,因此打印的结果可读):

type DBReplicated struct {
    DB *DBS `json:"db"`
}

type DBS struct {
    URL      string            `json:"url"`
    Port     string            `json:"port"`
    Uname    string            `json:"uname"`
    Pass     string            `json:"pass"`
    Authdb   string            `json:"authdb"`
    Replicas []map[string]*DBS `json:"replicas"`
}

func main() {
    var dbs []*DBReplicated
    if err := json.Unmarshal([]byte(src), &dbs); err != nil {
        panic(err)
    }

    db := dbs[0].DB
    fmt.Printf("%+v\n", db)
    for _, dbs := range db.Replicas {
        for name, replica := range dbs {
            fmt.Printf("%s: %+v\n", name, replica)
        }
    }
}

输出(在Go Playground上尝试):

&{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:0x10538200] map[rs02:0x10538240]]}
rs01: &{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}
rs02: &{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将具有相同内部结构的两个json解组为一个单独的golang结构?

尝试解组从文件中读取的字符串时收到没有错误的空映射(答案:解组到数据结构本身)

将具有重复字段的字符串解组到json中

元帅到JSON结构扩展了另一个具有相同字段标签的结构

为什么变量a(json字符串)未解组到结构A中?

一个简单的xml元素如何解组到golang结构?

如何根据条件将字符串中的字符动态替换为具有相同结构的另一个字符串中的字符?

将字符串反序列化为具有 2 个 uint 字段的结构

Athena unnest另一个结构的json数组中的字符串的json数组

在另一个转换字符串结构

如何使用结构将字母从每个字符串移动到一个新字符串?

无法将JSON解组到结构中

有没有办法声明一个具有任意长度字符串字段的结构化数组?

在 Golang 中将字符串解组为类似结构的结构

将一个表复制到另一个具有不同结构的表

一个具有多个json表示形式的结构

去解组JSON,但解组嵌套结构作为字符串

将字符串与另一个具有动态字符串内容的字符串匹配

XSD 1.1:将元素限制用于具有特定子字符串的另一个属性

将具有空间的字符串值传递到另一个Powershell文件

Redis-数据结构,一个接一个地插入字符串,一次删除所有字符串

将一个结构复制到另一个具有相同成员和不同类型的结构

将VBA Type / C结构移植到Python ctypes.Structure:具有固定长度的字符串数组

如何从List <KeyValuePair <字符串,字符串>>中获取具有一个元素公共值的条目?

检查结构字符串数组是否包含另一个字符串数组的元素

将字符串数组的一个元素复制到另一个 java

将字符串转换为结构数组,然后在另一个表SQL中查找值

如何从具有python中表/数据框结构的字符串中提取元素行

使用proc sql将具有不同结构的多个表堆叠到一个表中