亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號