无法在golang中解析复杂的json



我想解析这个JSON(在config/sync .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]接口{}(或允许该对象的另一个对象)中的json.Unmarshal函数的值,在那里我可以访问,例如,分钟结束(10)的值:parsedMap["exec_period"]["end"]["minute"],但我不理解JSON和go的"通用JSON与接口{}"部分在golang.org

您的代码很好,除了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{}中,但是如果数据具有固定的结构(例如您的问题中的结构),那么您的解决方案很可能更可取。使用接口{}将需要类型断言,最终可能看起来很乱。您的示例看起来像这样:

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

最新更新