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 关注
- 145 浏览
添加回答
举报