我使用“github.com/olivere/elastic”从Elasticsearch返回数据。那种工作,当我将它添加到我的结构并将其串起来时,就像这样,
data := Api {
Total: myTotal,
Data: string(result),
}
c.JSON(http.StatusOK, totalData)
api就是这样的结构,
type Api struct {
Total interface{}
Data interface{}
}
这将返回数据ok,从1到请求的任意数量的结果。加载到数据接口的结果如何不被转义或某些东西,例如
"Data":"{\"CID\":\"XXXXXXXXXX\",\"Link\":\"XXXXXXXXX\",
所以我尝试在将数据添加到api结构之前解组数据。
var p DataApi
err := json.Unmarshal(result, &p)
if err != nil {
panic(err)
}
totalData := Api {
Total: myTotal,
Data: p,
}
c.JSON(http.StatusOK, totalData)
这种工作正常,以正确的方式返回数据,但仅在加载一个结果时。当请求2个或更多结果时,我从unmarshal panic
中得到此错误invalid character '{' after top-level value
我已经尝试过谷歌了但是找不到解决方法吗?我不确定我做错了什么? DataApi是一组嵌套的结构,我不确定是否有任何我应该存在的东西?
这是在Gin框架内运行。
感谢。
修改
因此,当我在字符串(结果)上使用fmt.Println
时,我可以在屏幕上打印任意数量的结果。如何将其添加到API结构中,然后我需要将结构转换为JSON数据。有没有办法在JSON转换的API结构上附加此字符串数据?
答案 0 :(得分:0)
尝试将多个结果解组为切片:
var q []Api
err = json.Unmarshal(result, &q)
参见游乐场https://play.golang.org/p/D_bVAd4jBlI
package main
import (
"encoding/json"
"fmt"
)
type Api struct {
Total interface{}
Data interface{}
}
func main() {
data := Api{
Total: 1,
Data: "2",
}
result, err := json.Marshal(data)
if err != nil {
panic(err)
}
fmt.Printf("single data: %s\n", result)
var p Api
err = json.Unmarshal(result, &p)
if err != nil {
panic(err)
}
dataSlice := []Api{data}
result, err = json.Marshal(dataSlice)
if err != nil {
panic(err)
}
fmt.Printf("slice of data: %s\n", result)
var q []Api
err = json.Unmarshal(result, &q)
if err != nil {
panic(err)
}
}
答案 1 :(得分:0)
使用json.RawMessage存储任意JSON文档:
var p json.RawMessage
err := json.Unmarshal(result, &p)
if err != nil {
panic(err)
}
totalData := Api {
Total: myTotal,
Data: p,
}
c.JSON(http.StatusOK, totalData)
答案 2 :(得分:0)
我有一个解决我的问题的工作方案,我只是使用Hits Hits从弹性搜索返回的数据,我想只是源数据,但我认为它做了我需要它做的...现在。
感谢。