为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中没有结构的情况下对 JSON 数据进行最小的修改

在 golang 中没有结构的情况下对 JSON 数据进行最小的修改

Go
慕桂英3389331 2021-12-13 18:43:14
我有一个 JSON 格式的 solr 响应,如下所示: {  "responseHeader": {    "status": 0,    "QTime": 0,    "params": {      "q": "solo",      "wt": "json"    }  },  "response": {    "numFound": 2,    "start": 0,    "docs": [      {          <Large nested JSON element>      },      {          <Large nested JSON element>      }    ]  }}现在,在我的 Golang 应用程序中,我想快速删除“responseHeader”,以便我可以单独返回“response”。如何在不创建大型结构的情况下做到这一点?编辑 1evanmcdonnal 的答案是这个问题的解决方案,但它有一些小的错别字,这是我最终使用的:var temp map[string]interface{}if err := json.Unmarshal(body, &temp); err != nil {    panic(err.Error())}result, err := json.Marshal(temp["response"])
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

这是一个非常简短的示例,说明如何快速轻松地执行此操作。步骤是; 解组到通用map[string]interface{}然后,假设没有错误,只编组你想要的内部对象。


var temp := &map[string]interface{}


if err := json.Unmarshal(input, temp); err != nil {

     return err;

}


return json.Marshal(temp["response"])


查看完整回答
反对 回复 2021-12-13
?
三国纷争

TA贡献1804条经验 获得超7个赞

我编写了一个包µjson来做到这一点:在 JSON 文档上执行通用转换而不解组它们。


input := []byte(`

{

  "responseHeader": {

    "status": 0,

    "QTime": 0,

    "params": {

      "q": "solo",

      "wt": "json"

    }

  },

  "response": {

    "numFound": 2,

    "start": 0,

    "docs": [

      { "name": "foo" },

      { "name": "bar" }

    ]

  }

}`)


blacklistFields := [][]byte{

    []byte(`"responseHeader"`), // note the quotes

}

b := make([]byte, 0, 1024)

err := ujson.Walk(input, func(_ int, key, value []byte) bool {

    for _, blacklist := range blacklistFields {

        if bytes.Equal(key, blacklist) {

            // remove the key and value from the output

            return false

        }

    }


    // write to output

    if len(b) != 0 && ujson.ShouldAddComma(value, b[len(b)-1]) {

        b = append(b, ',')

    }

    if len(key) > 0 {

        b = append(b, key...)

        b = append(b, ':')

    }

    b = append(b, value...)

    return true

})

if err != nil {

    panic(err)

}

fmt.Printf("%s", b)

// Output: {"response":{"numFound":2,"start":0,"docs":[{"name":"foo"},{"name":"bar"}]}}

您可以在博客文章中阅读更多相关信息。我把答案放在这里以防其他人可能需要它。


查看完整回答
反对 回复 2021-12-13
  • 2 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信