gpt4 book ai didi

json - 如何在不编码整个文档的情况下清空现有 JSON 数组对象

转载 作者:行者123 更新时间:2023-12-01 22:23:07 24 4
gpt4 key购买 nike

我正在尝试从文件中导入一个大型 JSON 文档,清空与特定键或模式匹配的所有数组,然后输出它,而无需编码整个文档。

它将作为定期批处理作业的一部分运行,因此性能/效率不是优先事项。

简单性并确保代码与整体 JSON 结构无关,这一点更为重要。

有没有一种简单的方法可以在 Go 中解决这个问题?

示例输入:

{
"panels": [
{
"alert": {
"executionErrorState": "alerting",
"notifications": [
{
"uid": "fRLbH_6Zk"
},
{
"uid": "8gamKl6Waz"
}
]
}
},
{
"alert": {
"executionErrorState": "alerting",
"notifications": [
{
"uid": "DqjrD_6Zk"
}
]
}
}
]
}

所需的输出(删除了“面板”中“alert.notifications”中的所有条目):
{
"panels": [
{
"alert": {
"executionErrorState": "alerting",
"notifications": []
}
},
{
"alert": {
"executionErrorState": "alerting",
"notifications": []
}
}
]
}

最佳答案

您可以使用读取流,逐个读取对象。代码将解码第一个对象,但在下一个对象上会出错。它就像批准代码不读取整个文件的状态,这里的例子:

package main

import (
"encoding/json"
"fmt"
"log"
"strings"
)

func main() {
const jsonStream = `
[
{"Name": "Ed", "Text": "Knock knock."},
asdasd sadasd,
`
type Message struct {
Name, Text string
}
dec := json.NewDecoder(strings.NewReader(jsonStream))

// read open bracket
t, err := dec.Token()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%T: %v\n", t, t)

// while the array contains values
for dec.More() {
var m Message
// decode an array value (Message)
err := dec.Decode(&m)
if err != nil {
log.Fatal(err)
}

fmt.Printf("%v: %v\n", m.Name, m.Text)
}

// read closing bracket
t, err = dec.Token()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%T: %v\n", t, t)

}

关于json - 如何在不编码整个文档的情况下清空现有 JSON 数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61746286/

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