首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go中表示这个JSON的最佳方式?

在Go中表示这个JSON的最佳方式?
EN

Stack Overflow用户
提问于 2015-05-13 11:56:26
回答 2查看 516关注 0票数 1

我正在编写一个端点来返回Geckoboard的数据,它除外如下格式:

代码语言:javascript
复制
{
  "item": [
    {
      "value": "274057"
    },
    [
      "38594",
      "39957",
      "35316",
      "35913",
      "36668",
      "45660",
      "41949"
    ]
  ]
}

"item"是一个由各种结构组成的数组。我将如何在Go中表示这些数据?

注意:这不是我如何解压缩的问题,我需要生成这种格式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 12:21:19

这东西比你想象的要容易。只是对随便的读者来说没有那么好的记录。我推荐ffjson而不是普通的json。它是以这样一种方式组成的,您不需要更改库名称以外的语法。

这很简单,因为:

代码语言:javascript
复制
type User struct {
    Id      int    `json:'id'`
    Name    string `json:name`
    SomeId1 int    `json:some_id_1`
    SomeId2 int    `json:some_id_2`
    SomeId3 int    `json:some_id_3`
    SomeId4 int    `json:some_id_4`
}

item := map[string]User{}
for i := 0; i < 10; i++ {
    item[strconv.itoa(i)] = User{i, "Username X", 38393, 29384, 12393, 123981}
}
buf, err := ffjson.Marshal(&item)

结构的缺点(即使在ffjson中仍然如此)是总是使用reflection,在需要高性能的时候,这会浪费大量的CPU周期。当你把ffjson保持在地图上时,它的速度是普通json的2-3倍.通过这种方式,库可以编译您编组的每个数据结构,并重用它,而不是经常使用reflect检查数据完整性/结构。

票数 1
EN

Stack Overflow用户

发布于 2015-05-13 12:38:27

有一种简单的方法可以创建某些数据结构的值,其中您知道要生成/复制的JSON输出:

获取要生成的输出,并将其解压缩为map[string]interface{}。您将得到一个映射值,当您封送时,它将产生您想要的输出。当您解组预期的输出时,您可以检查结果映射值,以了解您需要为预期的输出创建什么。

这也适用于你的情况。以下是代码:

代码语言:javascript
复制
var m map[string]interface{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Printf("%+v\n", m)

res, err := json.MarshalIndent(m, "", "  ")
if err != nil {
    panic(err)
}
fmt.Println(string(res))

其中input是您的JSON输入:

代码语言:javascript
复制
const input = `{
  "item": [
    {
      "value": "274057"
    },
    [
      "38594",
      "39957",
      "35316",
      "35913",
      "36668",
      "45660",
      "41949"
    ]
  ]
}`

此程序生成与所需输出(或输入)相同的输出:

代码语言:javascript
复制
map[item:[map[value:274057] [38594 39957 35316 35913 36668 45660 41949]]]
{
  "item": [
    {
      "value": "274057"
    },
    [
      "38594",
      "39957",
      "35316",
      "35913",
      "36668",
      "45660",
      "41949"
    ]
  ]
}

围棋游乐场上尝试完整的应用程序。

分析未封送的映射值:

显然,它有一个键"item",其值的类型是:

代码语言:javascript
复制
fmt.Printf("%T\n", m["item"]); // Prints []interface{}

所以这是一片。它有两个值,它们的类型:

代码语言:javascript
复制
fmt.Printf("%T\n", m["item"].([]interface{})[0]); // map[string]interface{}
fmt.Printf("%T\n", m["item"].([]interface{})[1]); // []interface{}

因此,切片包含两个值:

  • 地图( "value" : "274057"对)
  • 和另一片( ids或号码列表)

下面是用于复制相同映射值的Go代码:

代码语言:javascript
复制
m := map[string]interface{}{
    "item": []interface{}{
        map[string]interface{}{"value": "274057"},
        []interface{}{"38594", "39957", "35316", "35913", "36668", "45660", "41949"},
    },
}

封送这将产生相同的JSON输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30214094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档