我是Go的新手并尝试使用github中的库将JSON解析为CSV。 https://github.com/jehiah/json2csv
但我遇到了这个问题:作者没有回复的https://github.com/jehiah/json2csv/issues/22。
我意识到如果我们将以下JSON作为json.input提供给文件:
{"user": {"name":["jehiah, mike, semo"], "password": "root"}, "remote_ip": "127.0.0.1", "dt" : "[20/Aug/2010:01:12:44 -0400]"}
{"user": {"name":["jeroenjanssens", "jeroen2", "jero55"], "password": "123"}, "remote_ip": "192.168.0.1", "dt" : "[20/Aug/2010:01:12:44 -0400]"}
{"user": {"name":"markdata", "password": ""}, "remote_ip": "76.216.210.0", "dt" : "[20/Aug/2010:01:12:45 -0400]"}
现在,如果我尝试将其用作命令:go run main.go -k user.name -i input.json -o output.json
它返回以下输出:
"[jehiah, mike, semo]"
[jeroenjanssens jeroen2 jero55]
markdata
但正如在opend发布中所述,我期待响应为:
jehiah, mike, semo
jeroenjanssens, jeroen2, jero55
markdata
我猜它正在发生,因为行:https://github.com/jehiah/json2csv/blob/master/main.go#L110无论如何在读取行时删除逗号。
您能否就如何达到上述期望的输出提出建议?
此致
答案 0 :(得分:1)
使用此代码,您将能够非常轻松地在Go结构中读取您的json数据:
package main
import (
"encoding/json"
"fmt"
)
// define the User type
type User struct {
Name []string
Password string
}
type DataStruct struct {
User User
Remote_ip string
Dt string
}
func main() {
var jsonBlob = []byte(`{"user": {"name":["jehiah, mike, semo"], "password": "root"},
"remote_ip": "127.0.0.1", "dt" : "[20/Aug/2010:01:12:44 -0400]"}`)
var data DataStruct
err := json.Unmarshal(jsonBlob, &data)
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Printf("%+v", data)
}
}
如果您从未使用 encoding / json 包,则应阅读官方Golang json article。
如果您正确阅读了 DataStruct 结构中的数据,则可以使用正确的Golang csv package对其进行序列化。
答案 1 :(得分:0)
这里有几个问题:
JSON定义的结构并不能用CSV表示,例如:
{"name":"john"}
["john", "mike", "sam"]
没有CSV标准。好吧,有RFC-4180,但大多数CSV编码器/解码器都不遵守它,因为微软。
您使用的软件包编码很差。
CSV实现的主要区别之一是报价处理。考虑JSON字符串:"\"Hello, world!\""
。
根据我们的编组,我们最终会得到以下任何字符串的CSV表示形式:
"""Hello, world!"""
"\"Hello, world!\""
'"Hello, world!"'
某些编码器甚至会转义字符串内的逗号。您描述的包通过完全跳过逗号来解决此问题。如果你问我,这是一个非常糟糕的设计决定。
您需要的一切都在Go的标准库中: