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

17 回复

只写 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/sjson

go<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文件并删减其字段:

  1. 读取JSON文件:使用os.Openio/ioutil(或osbufio组合)来读取文件内容。

  2. 解析JSON:使用json.Unmarshal将文件内容解析为Go中的数据结构,如map[string]interface{}或自定义结构体。

  3. 修改数据结构:根据需求删除不需要的字段。如果使用的是map[string]interface{},可以直接使用delete函数。

  4. 将修改后的数据写回JSON:使用json.Marshal将修改后的数据结构重新编码为JSON格式。

  5. 写回文件:使用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文件读取、修改和写回的过程。

回到顶部