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

时间:2016-02-16 19:20:16

标签: json go solr

我有一个JSON格式的solr响应,如下所示:

var temp map[string]interface{}

if err := json.Unmarshal(body, &temp); err != nil {
    panic(err.Error())
}

result, err := json.Marshal(temp["response"])

现在,在我的Golang应用程序中,我想快速删除“responseHeader”,以便我可以单独返回“响应”。如何在不创建大型结构的情况下实现这一目标?

编辑1

evanmcdonnal的答案是这个问题的解决方案,但它有一些小错字,这是我最终使用的:

.maincols {
  display: flex;
  flex-wrap:wrap;
  width:100%;
  border:solid;
  margin:1em 0;
}
.maincol {
  min-width: 25%;/* can grow wider */
  box-shadow:inset 0 0 0 1px  ;
}
.maincol:last-of-type {
  flex: 1;/* fills up whole room left */
  text-align:center;
}

2 个答案:

答案 0 :(得分:5)

以下是如何快速轻松地完成此操作的简短示例。步骤是;然后,在没有错误的情况下解组为通用var temp := &map[string]interface{} if err := json.Unmarshal(input, temp); err != nil { return err; } return json.Marshal(temp["response"]) ,只编组你想要的内部对象。

public class Execute extends JFrame {
 public Execute() {
  initUI();
 }

 public void initUI() {
  // you were creating an entirely different frame here
  // instead initialize **this** frame
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setSize(600,600);
  setTitle("I am the salad baby");

  add(new Board());
 }
// ...
}

答案 1 :(得分:0)

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

Run on Go Playground

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"}]}}

你可以read more about it on the blog post。我把答案放在这里以防其他人可能需要它。