Golang Json 取消使用多个动态命名字段进行取消分组

我有以下需要解码的Json结构,我不确定取消编组的正确方法。


var b = []byte(`{

    "Card:5417871461137421886": {

        "applicationUUID": "5417871461137421886",

        "commit": "test_commit",

        "lastSeen": "test_lastSeen",

        "localUUID": "E4:F5:13:8E:F5:43",

        "progress": "3.5",

        "externalUUID": "test_externalUUID",

        "state": "test_state"

    },

    "Card:5417871461137421886.Color": {

        "applicationUUID": "5417871461137421886",

        "color": "blue"

    }

}`)

我最初的方法是以某种方式创建一个结构,然后取消到结构,但由于动态性质,我不确定如何实现这一点。我尝试过的一种方法是使用并行结构,但是我没有成功地使其正常工作。我有点不知所措,无法找到解决这个问题的好方法,你可以在这里看到我的示例代码 https://play.golang.org/p/mzMArgo8ta2


我无法更改Json的结构,因为它是从API读取的。最终,我不想要或不关心唯一的字段名称,因为应用程序 ID 始终作为值列出。如果有一个简单的方法来删除所有的Card:Id,我想我可以像往常一样映射它。


慕桂英3389331
浏览 98回答 2
2回答

侃侃无极

一种选择可能是延迟解析,直到您知道类型为止。类似下面的内容(游乐场):devices := make(map[string]json.RawMessage)err := json.Unmarshal(b, &devices)if err != nil {    log.Fatal(err)}for key, jsonVal:= range devices {    if len(key) > 5 && key[:5] == "Card:" {        var dev Device        err := json.Unmarshal(jsonVal, &dev)        if err != nil {            log.Fatal(err)        }        fmt.Printf("%#v\n", dev)    } else if len(key) > 6 && key[:6] == "Color:" {        var oth Other         err := json.Unmarshal(jsonVal, &oth)        if err != nil {            log.Fatal(err)        }        fmt.Printf("%#v\n", oth)    }}注意:不清楚您要如何处理数据,因此我现在只是打印结构。它也不太清楚如何识别每个元素的类型(问题中的示例与示例代码中的示例不同);可能有一些API的文档可以解释这一点?。

叮当猫咪

我会这样做:package mainimport (   "encoding/json"   "fmt")const s = `{   "Card:5417871461137421886": {      "applicationUUID": "5417871461137421886",      "commit": "test_commit",      "externalUUID": "test_externalUUID",      "lastSeen": "test_lastSeen",      "localUUID": "E4:F5:13:8E:F5:43",      "progress": "3.5",      "state": "test_state"   },   "Card:5417871461137421886.Color": {      "applicationUUID": "5417871461137421886",      "color": "blue"   }}`func main() {   var m map[string]struct {      ApplicationUUID, Color, Commit, ExternalUUID, LastSeen, LocalUUID string      Progress, State string   }   json.Unmarshal([]byte(s), &m)   fmt.Printf("%+v\n", m)}但似乎也会起作用。map[string]map[string]string
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go