【问题标题】:如何在 Go 的结构中打印出 JSON 的特定部分?
【发布时间】:2022-01-21 02:45:51
【问题描述】:

我想打印出我在 Go 结构中的 JSON 的第一“行”。 JSON 看起来像

[
   {
      "id":"7",
      "username":"user",
      "subject":"subject",
      "message":"message"
   },
   {
      "id":"6",
      "username":"user2",
      "subject":"subject2",
      "message":"message2"
   },
   {
      "id":"5",
      "username":"user3",
      "subject":"subject3",
      "message":"message3"
   },
   {
      "id":"4",
      "username":"user4",
      "subject":"subject4",
      "message":"message4"
   },
   {
      "id":"3",
      "username":"user5",
      "subject":"subject5",
      "message":"message5"
   },
   {
      "id":"2",
      "username":"user6",
      "subject":"subject6",
      "message":"message6"
   },
   {
      "id":"1",
      "username":"user7",
      "subject":"subject7",
      "message":"message7"
   }
]

我把它放在这样的结构中

type Info struct {
    Id string
    Username string
    Subject string
    Message string
}
infoJson := html;
var information []Info;
err2 := json.Unmarshal([]byte(infoJson), &information);
if err2 != nil {
    fmt.Println(err2);
}

然后我可以使用

将它们全部打印出来
for _, info := range information {
    fmt.Println(info.Id + " " + info.Username);
    fmt.Println(info.Subject);
    fmt.Println(info.Message);
}

我希望能够打印出与特定 id 对齐的 JSON。例如,我希望能够指定 7,然后 id:7 JSON 行中的所有内容都将以上述格式打印出来。所以它应该打印出来:

7 user
subject
message

我该怎么做?

【问题讨论】:

  • if info.Id != 7 { continue }
  • 我经常使用 map[int]Info 之类的东西创建字典。或者如果您知道它是唯一的,则使用字符串作为键。因此,不是附加到切片中,而是插入到地图中。然后不需要循环来获取元素或检查是否存在

标签: arrays json go struct println


【解决方案1】:

如果你想打印“第一个”项目。那么你当然可以使用项目的索引来做到这一点。

fmt.Println(information[0])

如果要打印特定项目,则必须使用范围进行迭代并检查项目是否符合条件。

构建项目的映射可能更有帮助,在这种情况下使用 ID 作为键。

// Print the first item.
fmt.Println(information[0])

// Create a map to index items by ID.
dictionary := make(map[string]Info)
for _, info := range information {
    dictionary[info.Id] = info
}

element, ok := dictionary["7"]
if !ok {
    fmt.Println("Not found.")
    return
}
fmt.Println(element)

您还可以在 Info 上添加一个方法来包含格式化逻辑。

func (i *Info) Print() string {
    return fmt.Sprintf("%s %s\n%s\n%s\n", i.Id, i.Username, i.Subject, i.Message)
}

然后简单地调用它:

// Print the first item.
fmt.Println(information[0].Print())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 2015-02-24
    • 1970-01-01
    • 2019-04-02
    • 2016-01-19
    • 2020-05-23
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多