gpt4 book ai didi

json - 是否可以部分解码和更新 JSON? (走)

转载 作者:IT王子 更新时间:2023-10-29 02:16:13 25 4
gpt4 key购买 nike

我只需要解码和更新 json 对象的特定值。问题是我不知道对象的完整结构。 encoding/json 包“忽略”/截断结构中未提供的字段,因此在编码时这些字段将丢失。 我想知道是否可以只解码我知道的结构,更新它然后编码它而不截断/删除未知的结构/信息。

最佳答案

我知道这是一个很老的问题,但我了解到通常的结构和 json.RawMessage 的组合将在这种情况下完成工作。让我分享。

要点是:将整个数据保存到 raw 字段中,并将其用于编码/解码。其他字段可以从那里派生。

package main

import (
"encoding/json"
"log"
)

type Color struct {
Space string
raw map[string]json.RawMessage
}

func (c *Color) UnmarshalJSON(bytes []byte) error {
if err := json.Unmarshal(bytes, &c.raw); err != nil {
return err
}
if space, ok := c.raw["Space"]; ok {
if err := json.Unmarshal(space, &c.Space); err != nil {
return err
}
}
return nil
}

func (c *Color) MarshalJSON() ([]byte, error) {
bytes, err := json.Marshal(c.Space)
if err != nil {
return nil, err
}
c.raw["Space"] = json.RawMessage(bytes)
return json.Marshal(c.raw)
}

func main() {
before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`)
log.Println("before: ", string(before))

// decode
color := new(Color)
err := json.Unmarshal(before, color)
if err != nil {
log.Fatal(err)
}

// modify fields of interest
color.Space = "RGB"

// encode
after, err := json.Marshal(color)
if err != nil {
log.Fatal(err)
}
log.Println("after: ", string(after))
}

输出应该是这样的:

2020/09/03 01:11:33 before:  {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}
2020/09/03 01:11:33 after: {"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}

注意:这不会保留键顺序或缩进。

关于json - 是否可以部分解码和更新 JSON? (走),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com