Синтаксический анализ кластерной роли в формате JSON в Go не работает

#go #kubernetes

#Вперед #kubernetes

Вопрос:

У меня проблема с анализом метаданных в объекте кластерной роли из Json в Go.

Я сделал этот пример:

 package main

import (
    "encoding/json"
    "fmt"

    "k8s.io/kubernetes/pkg/apis/rbac"
)

func main() {
    clusterDemo := rbac.ClusterRole{}

    clusterRolesRaw := `{
        "apiVersion": "rbac.authorization.k8s.io/v1",
        "kind": "ClusterRole",
        "metadata": {
            "creationTimestamp": "2021-01-21T08:07:13Z",
            "managedFields": [],
            "name": "kubeadm:get-nodes",
            "resourceVersion": "220",
            "uid": "c78a8b10-cd20-4b64-8e4d-4f7f758c7b65"
        },
        "rules": []
    }`
    err := json.Unmarshal([]byte(clusterRolesRaw), amp;clusterDemo)
    if err != nil {
        fmt.Printf("unmarshal file: %v", err)
    }
    fmt.Printf("Name: %sn", clusterDemo.Name)
    fmt.Printf("Kind: %sn", clusterDemo.Kind)
}

 

Запустите его с помощью

 # go get -v ./... 
# go run <filename>
Name: 
Kind: ClusterRole
 

Как вы можете видеть, поле вида анализируется, а поле имени (часть метаданных) — нет.

Мой вопрос в том, почему? Похоже, вложенная структура не анализируется.

Любая помощь приветствуется, я думаю, что я что-то упускаю

Комментарии:

1. В pkg.go.dev/k8s.io/kubernetes/pkg/apis/rbac#Кластерная роль metav1.ObjectMeta является встроенным / встроенным полем. Итак, я не думаю, что в JSON должны быть вложенные поля metadata ?

2. Это то, что я получаю от «kubectl get clusterroles -o json»

Ответ №1:

Измените импорт с "k8s.io/kubernetes/pkg/apis/rbac" на rbac "k8s.io/api/rbac/v1" .

Это должно сработать.