【问题标题】:"unexpected end of JSON input" when an array of objects is passed in POST request在 POST 请求中传递对象数组时出现“JSON 输入意外结束”
【发布时间】:2019-04-19 10:24:31
【问题描述】:
import "github.com/gin-gonic/gin"

func Receive(c *gin.Context) {
  // Gets JSON ecnoded data
  rawData, err := c.GetRawData()
  if err != nil {
      return nil, err
  }

  logger.Info("Raw data received - ", rawData)
}

当我传递 Json 对象 {"key":"value"} 时,此代码 sn-p 有效,但出现错误:

“JSON 输入意外结束”

当我将[{"key":"val"},{"key": "val"}] 之类的数组作为输入传递时。

【问题讨论】:

  • GetRawData 对 json 没有任何作用,它只是读取请求的正文,因此您引用的错误必须来自您尚未共享的代码。
  • 我通过 Postman 发送请求,使用正文下的“原始”选项
  • 是否设置为JSON (application/json)
  • @Neville 我想说的是GetRawData 不可能返回错误unexpected end of JSON input(除非您使用的是其他版本的杜松子酒),该错误由encoding/json 的解码器,GetRawData 从未接触过。因此,您共享的处理程序代码与您遇到的问题无关,错误来自其他地方。无论是 Postman 的问题,还是试图做一些魔术的杜松子酒,还是您可能正在使用的某些中间件,我都不知道 GetRawData 它是不是
  • @mkopriva - 抱歉,问题发生在我执行 json.Unmarshall 时。现在解决了。

标签: go go-gin


【解决方案1】:

All GetRawData() does 是返回流数据,因此不会导致您的错误:

// GetRawData return stream data.
func (c *Context) GetRawData() ([]byte, error) {
    return ioutil.ReadAll(c.Request.Body)
}

但是,请尝试使用 BindJSON 并反序列化为结构。参见例如this question

type List struct {
    Messages []string `key:"required"`
}

func Receive(c *gin.Context) {
    data := new(List)
    err := c.BindJSON(data)
    if err != nil {
        return nil, err
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2021-07-26
    • 2016-09-08
    • 1970-01-01
    • 2018-12-24
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多