Golang Go语言中怎么读取一个json文件后对其字段进行删减?
Golang Go语言中怎么读取一个json文件后对其字段进行删减?
json 内容未知,要删除的字段也未知
data.json:
{
"a": "hello",
"b": 9527,
"c": {
"d": 123
}
}
假设构建出的程序名叫 app,
希望 app --keys="a,b" --output="result.json"
输出结果为 result.json:
{
"c": {
"d": 123
}
}
刚学 go 没头绪。。。ioutil.ReadFile 读取文件,然后遍历 keys,用 jsoniter.Get 读取值?然后再拼成一个新的 json ?但是值是啥类型也不确定啊。。
更多关于Golang Go语言中怎么读取一个json文件后对其字段进行删减?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
只写 c 和 d 的结构体,或者在 tag 中忽略 a 和 b
可以看看这篇教程 https://colobu.com/2017/06/21/json-tricks-in-Go/
更多关于Golang Go语言中怎么读取一个json文件后对其字段进行删减?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go 和 json 打交道基本就是结构体。
转成 map[string]interface{},然后删掉字段再转回去
感觉用 go 做这个事情就是费力不讨好。。。
一般来说,类型应该可以确定的。如果真的不确定,可以用 interface{}
抛个砖
package main
import (
“os”
“encoding/json”
“io/ioutil”
“fmt”
“strings”
)
var (
filename string
rm_fields []string
)
func parseArg() {
if len(os.Args) != 3 {
fmt.Println(“Usage ./a.out $filename $rmFields”)
panic(0)
}
filename = os.Args[1]
rm_fields = strings.Split(os.Args[2], “,”)
}
func main() {
parseArg()
data, e := ioutil.ReadFile(filename)
if e != nil {
panic(e)
}
var tmp map[string]interface{}
e = json.Unmarshal(data, &tmp)
if e != nil {
panic(e)
}
for _, field := range rm_fields {
delete(tmp, field)
}
out, e := json.Marshal(tmp)
if e != nil {
panic(e)
}
fmt.Println(string(out))
}
正解
或者用 json.Raw?
json.Unmarshal 成 map 啊,然后对 map 操作,完了再 json.Marshal 回去
一条命令的事: jq ‘del(.a)|del(.b)’ test.json
另外 jq 的 golang 移植 https://github.com/itchyny/gojq
#10
简单一点的 jq ‘del(.a,.b)’ test.json
亲测可行!
恩,是这么操作了
不需要那么复杂,
https://github.com/tidwall/jj
这个库了解一下
python 处理这个不香吗
试下这个,也挺不错。https://github.com/tidwall/sjsongo<br>Delete a value:<br><br>value, _ := sjson.Delete(`{"name":{"first":"Sara","last":"Anderson"}}`, "name.first")<br>println(value)<br><br>// Output:<br>// {"name":{"last":"Anderson"}}<br>
在Go语言中,读取并处理JSON文件是一个常见的任务。你可以使用标准库中的encoding/json
包来实现读取和修改JSON数据的功能。以下是一个基本的步骤来实现读取JSON文件并删减其字段:
-
读取JSON文件:使用
os.Open
和io/ioutil
(或os
和bufio
组合)来读取文件内容。 -
解析JSON:使用
json.Unmarshal
将文件内容解析为Go中的数据结构,如map[string]interface{}
或自定义结构体。 -
修改数据结构:根据需求删除不需要的字段。如果使用的是
map[string]interface{}
,可以直接使用delete
函数。 -
将修改后的数据写回JSON:使用
json.Marshal
将修改后的数据结构重新编码为JSON格式。 -
写回文件:使用
os.Create
和文件写入操作将新的JSON内容写回文件。
以下是一个简化的示例代码:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
func main() {
// 读取JSON文件
data, err := ioutil.ReadFile("data.json")
if err != nil {
fmt.Println(err)
return
}
// 解析JSON
var jsonMap map[string]interface{}
json.Unmarshal(data, &jsonMap)
// 删除字段
delete(jsonMap, "unwantedField")
// 将修改后的数据编码为JSON
newData, err := json.MarshalIndent(jsonMap, "", " ")
if err != nil {
fmt.Println(err)
return
}
// 写回文件
err = ioutil.WriteFile("data_modified.json", newData, 0644)
if err != nil {
fmt.Println(err)
}
}
这段代码展示了基本的JSON文件读取、修改和写回的过程。