【问题标题】:Error in parsing JSON data properly using Go使用 Go 正确解析 JSON 数据时出错
【发布时间】:2014-08-29 10:26:34
【问题描述】:

我是 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 无论如何在阅读该行时删除逗号。

您能否建议如何实现上述预期输出?

问候

【问题讨论】:

  • 为什么不直接序列化从json文件中读取的数据而不使用任何其他库呢?您有具体要求吗?
  • @AlessandroSuglia 我该怎么做?有什么例子吗?
  • 我已经发布了答案。我希望这会帮助你完成你的任务:)

标签: json string parsing csv go


【解决方案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 对其进行序列化。

【讨论】:

    【解决方案2】:

    这里有几个问题:

    1. JSON 定义的结构在 CSV 中并非都可以表示,例如:

      • 对象,例如{"name":"john"}
      • 数组,例如["john", "mike", "sam"]
    2. 没有 CSV 标准。好吧,有 RFC-4180,但大多数 CSV 编码器/解码器不遵守它,因为 Microsoft。

    3. 您使用的包编码很差。

    CSV 实现之间的主要区别之一是报价处理。考虑 JSON 字符串:"\"Hello, world!\""

    根据我们的编组器,我们最终可以得到以下任何字符串的 CSV 表示形式:

    • """Hello, world!"""
    • "\"Hello, world!\""
    • '"Hello, world!"'

    一些编码器甚至会转义字符串中的逗号。您描述的软件包通过完全跳过逗号来规避这个问题。如果你问我,这是一个非常糟糕的设计决定。

    你需要的一切都在 Go 的标准库中:

    1. encoding/json
    2. encoding/csv

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多