Estou tentando desempacotar alguns dados JSON. Acho que o problema é que os 2 arrays têm campos diferentes, então não correspondem corretamente à minha struct. Basicamente, preciso apenas dos dados do primeiro item no array. Existe uma maneira de lidar com isso? Aqui está o que eu tenho, no entanto, não está gerando nenhum erro, mas não parece estar retornando nada.
Aqui está um exemplo no Go Playground
package main
import (
"encoding/json"
"fmt"
"time"
)
var jsondata = `{
"Secrets": [
{
"name": "default",
"versionInfo": "2025-02-10T20:11:05Z/1",
"lastUpdated": "2025-02-10T20:11:05.512Z",
"secret": {
"@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret",
"name": "default",
"tlsCertificate": {
"certificateChain": {
"inlineBytes": "RRVkp2YjNSRApRVEV1WTN=="
},
"privateKey": {
"inlineBytes": "W3JlZFRDSGVkXQ=="
}
}
}
},
{
"name": "default2",
"versionInfo": "2025-02-10T20:11:05Z/3",
"lastUpdated": "2025-02-10T20:11:05.527Z",
"secret": {
"@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret",
"name": "ROOTCA",
"validationContext": {
"trustedCa": {
"inlineBytes": "LS0tLS1CRUdJTiBDRVJUSUZJ="
}
}
}
}
]
}`
type model struct {
Name string `json:"name"`
VersionInfo time.Time `json:"versionInfo"`
LastUpdated time.Time `json:"lastUpdated"`
Secret struct {
Type string `json:"@type"`
Name string `json:"name"`
TLSCertificate struct {
CertificateChain struct {
InlineBytes string `json:"inlineBytes"`
} `json:"certificateChain"`
PrivateKey struct {
InlineBytes string `json:"inlineBytes"`
} `json:"privateKey"`
} `json:"tlsCertificate"`
} `json:"secret"`
}
func main() {
input := []byte(jsondata)
//Source := (*json.RawMessage)(&data2)
var Info model
// Notice the dereferencing asterisk *
err := json.Unmarshal(input, &Info)
if err != nil {
//fmt.Printf(err.Error())
panic(err)
}
fmt.Printf("%s", Info.Name)
}
Seu JSON de entrada é um objeto que tem uma
Secrets
propriedade que é um array JSON. Você tem que modelar isso com um slice em Go, assim:E dentro do JSON
versionInfo
não há um horário válido (observe o/1
and final/3
, usestring
e você pode processá-lo mais tarde:Agora analisando sua entrada:
Isso produzirá (tente no Go Playground ):