【问题标题】:Unable to parse a complex json in golang无法在golang中解析复杂的json
【发布时间】:2013-06-20 08:45:08
【问题描述】:

我想解析这个 JSON(在 config/synch.conf 中):

{
    "period" :"yy",
    "exec_period" :  
        {
            "start" : {
                "month" : 1,
                "week" : 2,
                "day" : 3,
                "hour" : 4,
                "minute" : 5
            },
            "end" : {
                "month" : 6,
                "week" : 7,
                "day" : 8,
                "hour" : 9,
                "minute" : 10
            }
        },
    "backup" : [
        {
            "local_dir" : "directoryLo1",
            "server_dir" :  "directoryLo2",
            "server_host" : "domaineName"
        },
        {
            "local_dir" : "directoryLo1",
            "server_dir" :  "directorySe2",
            "server_host" : "domaineName"
        }
    ],
    "incremental_save" : "1Y2M"
}

有了这个程序:

package main

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

func main() {
    content, err := ioutil.ReadFile("config/synch.conf")
    if err == nil {

        type date struct{
            month float64
            week float64
            day float64
            hour float64
            minute float64
        }

        type period struct{
            start date
            end date
        }

        type backupType []struct{
            local_dir string
            server_dir string
            server_host string
        }

        type jason struct{
            period string
            exec_period period
            backup backupType
            incremental_save string
        }

        var parsedMap jason

        err := json.Unmarshal(content, &parsedMap)

        if err!= nil {
            fmt.Println(err)
        }

        fmt.Println(parsedMap)
    } else {
        panic(err)
    }

}

没有按预期工作,因为输出是:

{ {{0 0 0 0 0} {0 0 0 0 0}} [] }

这是 play.golang.org 上的相同示例
http://play.golang.org/p/XoMJIDIV59

我不知道这是否可以通过 go 实现,但我想获取存储在我可以访问的 map[string]interface{}(或另一个允许这样做的对象)中的 json.Unmarshal 函数的值,例如,分钟结束的值(10)如下:parsedMap["exec_period"]["end"]["minute"],但我不理解 golang.org 上JSON and Go 的“Generic JSON withinterface{}”部分

【问题讨论】:

    标签: json parsing go


    【解决方案1】:

    您的代码很好,只是 json 包只能用于导出的字段。

    如果您将每个字段名称的第一个字母大写,则一切正常:

    type date struct {
        Month  float64
        Week   float64
        Day    float64
        Hour   float64
        Minute float64
    }
    
    type period struct {
        Start date
        End   date
    }
    
    type backupType []struct {
        Local_dir   string
        Server_dir  string
        Server_host string
    }
    
    type jason struct {
        Period           string
        Exec_period      period
        Backup           backupType
        Incremental_save string
    }
    

    虽然可以编组为map[string]interface{},但如果数据具有固定结构(例如您的问题中的结构),则您的解决方案很可能更可取。使用 interface{} 将需要类型断言,最终可能看起来很混乱。您的示例如下所示:

    parsedMap["exec_period"].(map[string]interface{})["end"].(map[string]interface{})["minute"].(float64)
    

    【讨论】:

    • 真的,有那么简单吗?!谢谢你!
    • 现在,我的问题是,如何访问 exec_period 的分钟结束值? parsedMap["exec_period"]["end"]["minute"] 无效回复invalid operation: parsedMap["exec_period"] (index of type jason),首字母大写与否
    • 要访问该值,请使用 parsedMap.Exec_period.End.Minute 。比接口类型断言更干净! (正如我添加到答案中)
    • 如果我们有 JSON 格式的任意数据怎么办。我们必须使用 map[string]interface{}。对?你能给我举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2021-09-09
    • 2020-12-21
    相关资源
    最近更新 更多