2 回答

TA貢獻1802條經驗 獲得超5個贊
這里最簡單的事情是將 JSON 解析為一個對象,使用該對象,然后序列化回 JSON。
Kubernetes 提供了一個 Go 客戶端庫,它定義了v1.Pod 結構,您可以使用 stdlib 編碼/json 對其進行解組:
// import "k8s.io/api/core/v1"
var pod v1.Pod
if err := json.Unmarshal(podBody, &pod); err != nil {
? ? log.Fatalf("parsing pod json: %s", err)
}
從那里您可以閱讀pod.Spec.Containers和他們的VolumeMounts:
// Modify.
for c := range pod.Spec.Containers {
? ? container := &pod.Spec.Containers[c]
? ? for i, vol := range container.VolumeMounts {
? ? ? ? if strings.HasPrefix(vol.Name, "default-token-") {
? ? ? ? ? ? // Remove the VolumeMount at index i.
? ? ? ? ? ? container.VolumeMounts = append(container.VolumeMounts[:i], container.VolumeMounts[i+1:]...)
? ? ? ? }
? ? }
}
https://play.golang.org/p/3r5-XKIazhK
如果您擔心丟失輸入中可能出現的某些任意 JSON,您可能希望定義as 中的每個屬性,var pod map[string]interface{}
然后進行類型轉換,依此類推。spec, ok := pod["spec"].(map[string]interface{})
containers, ok := spec["containers"].([]map[string]interface)

TA貢獻1773條經驗 獲得超3個贊
要采取與以前完全不同的方法,您可以創建一個
type Root struct {
fields struct {
Spec *Spec `json:"spec,omitempty"`
}
other map[string]interface{}
}
使用自定義 UnmarshalJSON 解組到字段和其他字段,以及自定義 MarshalJSON 在返回 json.Marshal(other) 之前設置 other["spec"] = json.RawMessage(spec.MarshalJSON()) :
func (v *Root) UnmarshalJSON(b []byte) error {
if err := json.Unmarshal(b, &v.fields); err != nil {
return err
}
if v.other == nil {
v.other = make(map[string]interface{})
}
if err := json.Unmarshal(b, &v.other); err != nil {
return err
}
return nil
}
func (v *Root) MarshalJSON() ([]byte, error) {
var err error
if v.other["spec"], err = rawMarshal(v.fields.Spec); err != nil {
return nil, err
}
return json.Marshal(v.other)
}
func rawMarshal(v interface{}) (json.RawMessage, error) {
b, err := json.Marshal(v)
if err != nil {
return nil, err
}
return json.RawMessage(b), nil
}
然后,您可以通過 .spec.containers.volumeMounts 一直定義這些類型,并擁有一個 Container.MarshalJSON ,它會丟棄我們不喜歡的 VolumeMounts:
func (v *Container) MarshalJSON() ([]byte, error) {
mounts := v.fields.VolumeMounts
for i, mount := range mounts {
if strings.HasPrefix(mount.fields.Name, "default-token-") {
mounts = append(mounts[:i], mounts[i+1:]...)
}
}
var err error
if v.other["volumeMounts"], err = rawMarshal(mounts); err != nil {
return nil, err
}
return json.Marshal(v.other)
}
完整的游樂場示例:https ://play.golang.org/p/k1603cchwC7
我不會這樣做。
- 2 回答
- 0 關注
- 202 瀏覽
添加回答
舉報