go 怎么读取一个 json 文件后对其字段进行删减?

2020-04-11 22:39:44 +08:00
 b1anker

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 ?但是值是啥类型也不确定啊。。

3597 次点击
所在节点    Go 编程语言
16 条回复
KallyDev
2020-04-11 22:46:33 +08:00
只写 c 和 d 的结构体,或者在 tag 中忽略 a 和 b

可以看看这篇教程 https://colobu.com/2017/06/21/json-tricks-in-Go/
loading
2020-04-11 22:53:06 +08:00
go 和 json 打交道基本就是结构体。
Trim21
2020-04-11 22:55:22 +08:00
转成 map[string]interface{},然后删掉字段再转回去

感觉用 go 做这个事情就是费力不讨好。。。
cmdOptionKana
2020-04-11 22:56:08 +08:00
一般来说,类型应该可以确定的。如果真的不确定,可以用 interface{}
current
2020-04-11 23:00:28 +08:00
抛个砖

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))
}
feelinglucky
2020-04-11 23:01:38 +08:00
@Trim21 正解
current
2020-04-11 23:03:05 +08:00
leoleoasd
2020-04-11 23:37:34 +08:00
或者用 json.Raw?
index90
2020-04-11 23:45:19 +08:00
json.Unmarshal 成 map 啊,然后对 map 操作,完了再 json.Marshal 回去
darrh00
2020-04-11 23:55:27 +08:00
一条命令的事: jq 'del(.a)|del(.b)' test.json

另外 jq 的 golang 移植 https://github.com/itchyny/gojq
darrh00
2020-04-11 23:56:18 +08:00
#10

简单一点的 jq 'del(.a,.b)' test.json
b1anker
2020-04-12 00:07:48 +08:00
@current 亲测可行!
b1anker
2020-04-12 00:09:05 +08:00
@Trim21 恩,是这么操作了
yxlimo
2020-04-12 07:18:28 +08:00
不需要那么复杂,
https://github.com/tidwall/jj
这个库了解一下
NullErro
2020-04-13 08:33:45 +08:00
python 处理这个不香吗
guonaihong
2020-04-13 13:34:42 +08:00
试下这个,也挺不错。https://github.com/tidwall/sjson

```go
Delete a value:

value, _ := sjson.Delete(`{"name":{"first":"Sara","last":"Anderson"}}`, "name.first")
println(value)

// Output:
// {"name":{"last":"Anderson"}}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/661561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX