【问题标题】:GoLang Unmarshal JSON From Elastic Search ResultGoLang 从弹性搜索结果中解组 JSON
【发布时间】:2018-04-19 06:39:51
【问题描述】:

我使用“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{} 
}

这会根据请求返回数据,从 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 结构上附加这个字符串数据?

【问题讨论】:

  • 您能否举例说明string(result) 包含 1 个和多个结果时的样子?
  • 应该是这样,{"CID":"XXXXXXXXXX","Link":"XXXXXXXXX",}等

标签: elasticsearch go go-gin


【解决方案1】:

尝试将多个结果解组为一个切片:

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)
    }
}

【讨论】:

  • 刚试过这个,我得到了同样的错误,顶级值之后的无效字符'{'
  • @Coder99 您是否尝试在操场上运行示例play.golang.org/p/D_bVAd4jBlI
  • 我会的,抱歉忙了一天,现在详细研究一下。谢谢
  • 我是新手,但不知道这对我有什么帮助,我已经用我的数据进行了尝试,但仍然遇到同样的错误。我已经更新了问题
  • @Coder99 你能在操场上编辑这个例子,提供一个可运行的代码,准确地显示它是如何失败的吗?
【解决方案2】:

使用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)

【讨论】:

  • 刚才给出这个,仍然得到同样的错误,顶级值后的无效字符'{'
  • 这表明您正在尝试解组多个连接的 JSON 文档。改用 json.Decoder:play.golang.org/p/85WPi0NxYrT
【解决方案3】:

我有一个可行的解决方案来解决我的问题,我只使用弹性搜索返回的数据中的 Hits Hits,我只想要源数据,但我认为它可以满足我的需要......暂时。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2014-06-17
    • 2023-01-16
    • 1970-01-01
    • 2014-10-28
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多