gpt4 book ai didi

json - 在 golang 中动态地从 JSON 中删除 key

转载 作者:数据小太阳 更新时间:2023-10-29 03:08:16 24 4
gpt4 key购买 nike

我有一个可变的 JSON 架构 (json.RawMessage),它可以具有任意格式。我不知道编译时的格式。

在 golang 中,我想检查 root-JSON 对象中是否存在一个键,如果存在,则完全删除该键并反序列化。

例如,如果“foo”存在,我需要将其删除

{ "foo": [1,2,3], "bar123":"baz"} -> {"bar123":"baz" }
{ "foo": "test", "bar123":"baz"} -> { "bar123":"baz" }
{ "foo": {"bar":"bar2"}, "bar123":"baz"} -> { "bar123":"baz" }
{ "bar123":"baz"} -> { "bar123":"baz" }
{ "foo": {"bar":"bar2"}} -> {}

鉴于我需要提前知道 JSON 的结构以进行序列化和反序列化,我如何使用 go 来做到这一点?

最佳答案

如果您对 JSON 一无所知,您可能会解码为 interface{} 类型的值。 encoding/json包将为 JSON 对象选择 map[string]interface{},为 JSON 数组选择 []interface{}

您可以使用类型断言来检查结果是否为映射,您可以从中删除 "foo" 键,然后再次编码它:

例如:

inputs := []string{`{ "foo": [1,2,3], "bar":"baz"}`,
`{ "foo": "test", "bar123":"baz"}`,
`{ "foo": {"bar":"bar2"}, "bar123":"baz"}`,
`{ "bar123":"baz"}`,
`{ "foo": {"bar":"bar2"}}`,
}

for _, input := range inputs {
var i interface{}
if err := json.Unmarshal([]byte(input), &i); err != nil {
panic(err)
}
if m, ok := i.(map[string]interface{}); ok {
delete(m, "foo") // No problem if "foo" isn't in the map
}

output, err := json.Marshal(i)
if err != nil {
panic(err)
}
fmt.Println(string(output))
}

输出(在 Go Playground 上尝试):

{"bar":"baz"}
{"bar123":"baz"}
{"bar123":"baz"}
{"bar123":"baz"}
{}

如果您确定输入是一个 JSON 对象,您可以直接解码为 map[string]interface{} 类型的映射(或者更好:转换为 map[string ]json.RawMessage),所以代码会更简单:

var m map[string]json.RawMessage
if err := json.Unmarshal([]byte(input), &m); err != nil {
panic(err)
}
delete(m, "foo")

Go Playground 上试试这个.

另一个优化是检查键 "foo" 是否确实在映射中,如果是这样,则只删除它并编码修改后的映射。否则输入将是输出(无需更改):

var m map[string]json.RawMessage
if err := json.Unmarshal([]byte(input), &m); err != nil {
panic(err)
}

output := input
if _, exists := m["foo"]; exists {
delete(m, "foo")
outputData, err := json.Marshal(m)
if err != nil {
panic(err)
}
output = string(outputData)
}

fmt.Println(output)

Go Playground 上试试这个.

关于json - 在 golang 中动态地从 JSON 中删除 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307966/

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