为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕桂英3389331 2022-08-24 16:53:35
我有以下需要解码的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,我想我可以像往常一样映射它。
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

一种选择可能是延迟解析,直到您知道类型为止。类似下面的内容(游乐场):


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的文档可以解释这一点?。


查看完整回答
反对 回复 2022-08-24
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

我会这样做:


package main


import (

   "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


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信