为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2023-07-31 15:44:55
我正在创建一个 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  }
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

在这种情况下,我会考虑按以下顺序执行以下操作:

  • 您可以读取正文,并检查第一个非空格字符以查看它是否是“[”或“{”,并据此进行解组。

  • 您可以首先将其解组为数组,如果失败,则将其解组为单个对象。

  • 您可以解组到接口{},执行类型断言,然后自行解析内容。


查看完整回答
反对 回复 2023-07-31
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

检查第一个非空白字节以确定 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

}


查看完整回答
反对 回复 2023-07-31
?
MMTTMM

TA贡献1869条经验 获得超4个赞

为什么不直接添加 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


查看完整回答
反对 回复 2023-07-31
  • 3 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信