簡體   English   中英

用不同的鍵解組相同的json對象去切片結構

[英]Unmarshal same json object with different key to go slice struct

我不知道如何在不重寫整個解析器的情況下,使用Go切片結構的不同密鑰序列化相同的JSON對象。 例如,我可以收到的JSON,它可能包含帶有不同鍵的N個數字對象(localhost1 / localhost2 / localhost3等)。 在此示例中,我有一個鍵localhost1 / localhost2 / localhost3,每個鍵只有一個字段可以。

{
"stats": {
        "localhost1": {
            "ok": 1
        },
        "localhost2": {
            "ok": 1
        },
        "localhost3": {
            "ok": 1
        }
     }
}

我可以使用以下Structs映射來取消對整個JSON的編組。

type HostStatus struct {
        Ok int `json:"ok"`
}

type Test struct {
    Stats struct {
        Localhost1 HostStatus `json:"localhost1"`
        Localhost2 HostStatus `json:"localhost2"`
        Localhost3 HostStatus `json:"localhost3"`
    }  `json:"stats"`
}

整個示例。

package main

import (
    "encoding/json"
    "fmt"
)
type HostStatus struct {
        Ok int `json:"ok"`
}

type Test struct {
    Stats struct {
        Localhost1 HostStatus `json:"localhost1"`
        Localhost2 HostStatus `json:"localhost2"`
        Localhost3 HostStatus `json:"localhost3"`
    }  `json:"stats"`
}


func main() {
    var resp = []byte(`{
        "stats": {
            "localhost1": {
            "ok": 1
        },
        "localhost2": {
            "ok": 1
        },
        "localhost3": {
            "ok": 1
        }
        }
    }`)

    var r Test
    er := json.Unmarshal(resp, &r)
    if er != nil {
        panic(er)
    } else {
        fmt.Println(r)
    }
}

該解決方案的主要問題在於,它需要在Stats結構中使用硬編碼,以便每個HostStatus通過json:xxx標記將1:1映射到JSON輸出。 但是我想找到一種將所有對象映射到HostStatus切片/數組的方法,因為我不知道我可能會收到多少個HostStatus對象,每個對象的關鍵是什么。

例如類似

type Test struct {
    Stats struct {
        LocalHostList []HostStatus `json:"localhost[0-9]"`
    }  `json:"stats"`
}

並使用類似localhost [0-9]之類的東西-即正則表達式語義,這會給JSON包帶來沖擊。

嘗試這個:

type Test struct {
    Stats map[string]HostStatus `json:"stats"`
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM