当前位置:  开发笔记 > 编程语言 > 正文

Golang - Unmarshall JSON改变键值

如何解决《Golang-UnmarshallJSON改变键值》经验,为你挑选了1个好方法。

我正在尝试将JSON解组为一个结构体,但它证明是困难的,因为外部JSON密钥发生了变化,我只在一周前开始.这是我的手动尝试:

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

type Device struct {
    localUUID       string
    applicationUUID string
    externalUUID    string
    commit          string
    lastSeen        string
    state           string
    progress        float32
}

func main() {
    devices := make([]*Device, 0, 10)

    b := []byte(`{
        "5417871461137421886": {
            "applicationUUID": "test_applicationUUID",
            "commit": "test_commit",
            "lastSeen": "test_lastSeen",
            "localUUID": "E4:F5:13:8E:F5:43",
            "progress": "3.5",
            "externalUUID": "test_externalUUID",
            "state": "test_state"
        },
        "5632882567440442530": {
            "applicationUUID": "test_applicationUUID",
            "commit": "test_commit",
            "lastSeen": "test_lastSeen",
            "localUUID": "E4:F5:13:8E:F5:42",
            "progress": "3.5",
            "externalUUID": "test_externalUUID",
            "state": "test_state"
        },
        "8912255216147730520": {
            "applicationUUID": "test_applicationUUID",
            "commit": "test_commit",
            "lastSeen": "test_lastSeen",
            "localUUID": "E4:F5:13:8E:F5:41",
            "progress": "3.5",
            "externalUUID": "test_externalUUID",
            "state": "test_state"
        }
    }`)

    var f interface{}
    json.Unmarshal(b, &f)
    outer := f.(map[string]interface{})
    for _, value := range outer {
        inner := value.(map[string]interface{})
        device := &Device{}
        device.localUUID = inner["localUUID"].(string)
        device.applicationUUID = inner["applicationUUID"].(string)
        device.externalUUID = inner["externalUUID"].(string)
        device.commit = inner["commit"].(string)
        device.lastSeen = inner["lastSeen"].(string)
        device.state = inner["state"].(string)
        f, _ := strconv.ParseFloat(inner["progress"].(string), 32)
        device.progress = float32(f)

        devices = append(devices, device)
    }

    for _, device := range devices {
        fmt.Println(device)
    }
}

有没有办法忽略键并迭代值,允许我使用json.Unmarshal(b,&Device)?



1> JimB..:

您有一系列JSON对象,唯一ID 映射到每个对象Device.解组成一个map

type Device struct {
    LocalUUID       string  `json:"localUUID"`
    ApplicationUUID string  `json:"applicationUUID"`
    ExternalUUID    string  `json:"externalUUID"`
    Commit          string  `json:"commit"`
    LastSeen        string  `json:"lastSeen"`
    State           string  `json:"state"`
    Progress        float32 `json:"progress,string"`
}

func main() {
    devices := make(map[string]*Device)

    err := json.Unmarshal(b, &devices)
    if err != nil {
        log.Fatal(err)
    }

    for _, device := range devices {
        fmt.Printf("%#v\n", device)
    }
}

https://play.golang.org/p/JDZzG64jJR

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有