Create JSON array from seperate []byte results in GoLang

huangapple go评论93阅读模式
英文:

Create JSON array from seperate []byte results in GoLang

问题

我有一个来自tiedot查询的结果循环。

在最基本的形式下,它看起来像这样:

col.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
	return true
	return false
})

我可以将这些结果逐个发送给客户端,但不是我想要的。

我也可以使用json.Unmarshal创建单个JSON对象,但如何将它们合并成一个大的JSON数组呢?

非常感谢。我是GO的新手!

英文:

I have a loop of results coming from a tiedot query.

In it's most basic form it looks like this:

col.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
	return true
	return false
})

I can send these results down the pipe to the client, but only 1 at a time. Not quite what I want.

I can also create single JSON objects, using json.Unmarshal but how do I combine them all into 1 large JSON array?

Many thanks. New to GO!

答案1

得分: 2

如果你直接将这段代码返回给客户端,并且docContent是JSON格式的,你可以手动构建数组语法。如果docContent不是有效的JSON格式,它不提供任何安全性。

a := [][]byte{}

col.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
     a = append(a, docContent)
     return true
})
b := bytes.Join(a, []byte(`,`))

// 在开头插入'['
b = append(b, 0)
copy(b[1:], b[0:])
b[0] = byte('[')

// 追加']'
b = append(b, ']')

你也可以先解组(unmarshal)然后追加到切片(slice)最后再组合(marshal)切片

s := []interface{}{}
col.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
     var j interface{}
     if err := json.Unmarshal(docContent, &j); err != nil {
          // 处理错误
     }
     s = append(s, j)
     return true
})

b, err := json.Marshal(j)
英文:

If you are returning this directly to the client and your docContent is JSON you can just manually construct the array syntax. It does not provide any safety if docContent is not valid json.

a := [][]byte{}

col.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
     a = append(a, docContent)
     return true
})
b := bytes.Join(a, []byte(`,`))
    
// insert '[' to the front
b = append(b, 0)
copy(b[1:], b[0:])
b[0] = byte('[')

// append ']'
b = append(b, ']')

You could also unmarshal, then append to a slice, then marshal the slice

s := []interface{}{}
col.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
     var j interface{}
     if err := json.Unmarshal(docContent, &j); err != nil {
          // handle error
     }
     s = append(s, j)
     return true
})

b, err := json.Marshal(j)

huangapple
  • 本文由 发表于 2015年10月29日 22:56:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/33417637.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定