如何判断 []byte 是数组还是单个对象

我正在创建一个 API,它将接收特定路由中的对象。在这条路线中,我可以接收单个物体或大部分物体。


例子:


  [{"foo":"bar"}]

  {"foo":"bar"}

我如何知道主体请求是 de 之前的切片还是单个对象json.Unmarshal。此外,如果这是不可能的,接受这两种类型的正文请求并将其转换为对象列表的最佳方法是什么?


我期望这样的事情:


  type Foo struct {

    Foo string `json:"foo"`

  }


  func Bla() []Foo {


    fakeBody := []byte(`[{"foo":"bar"}]`)

    fakeBody2 := []byte(`{"foo":"bar"}`)     


    var foo []Foo


    // If fakeBody contains a array of objects

    // then parse it to the foo slice variable normally


    // So, if the fakeBody2 is a single object then 

    // parse this single object to the foo slice that will contain only

    // one element.


    return foo

  }


交互式爱情
浏览 132回答 3
3回答

慕娘9325324

在这种情况下,我会考虑按以下顺序执行以下操作:您可以读取正文,并检查第一个非空格字符以查看它是否是“[”或“{”,并据此进行解组。您可以首先将其解组为数组,如果失败,则将其解组为单个对象。您可以解组到接口{},执行类型断言,然后自行解析内容。

白猪掌柜的

检查第一个非空白字节以确定 JSON 文档是数组还是对象。相应地解码。func decode(body []byte) ([]Foo, error) {    b = bytes.TrimLeft(body, " \t\n\r")    if len(b) > 0 && b[0] == '[' {        var v []Foo        err := json.Unmarshal(body, &v)        return v, err    }    var v [1]Foo    err := json.Unmarshal(body, &v[0])    return v[:], err}

MMTTMM

为什么不直接添加 the [and]如果它不是他们的,然后始终将其视为数组?body := []byte(`{"foo":"bar"}`)body = bytes.TrimSpace(body)if len(body) > 0 && body[0] != '[' {    tmp := make([]byte, len(body)+2, len(body)+2)    tmp[0] = '['    tmp[len(tmp)-1] = ']'    copy(tmp[1:len(tmp)-1], body)    body = tmp}https://play.golang.org/p/YfnLgN9q64F或者,首先创建数组,然后根据第一个字符编组到数组或第一项:f := make([]Foo, 1)body := []byte(`{"foo":"bar"}`)if len(body) > 0 && body[0] != '[' {    json.Unmarshal(body, &f[0])} else {    json.Unmarshal(body, &f)}fmt.Println(f)https://play.golang.org/p/1fxBKH3ZJyH
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go