繁体   English   中英

在 Go 中处理“单个元素或数组”JSON 属性的最佳方法是什么?

[英]What is the best way to handle “a single element or an array” JSON property in Go?

现在我们有一个 JSON HTTP 请求数据,它是一个单一的元素,如{"data": {"id":1}}或一个元素数组,如{"data": [{"id":1}, {"id":2}]}

由于客户端无法更改实现,因此我们必须保留并接受此数据结构。

目前我实现了如下结构:

type Request struct {
  rawData json.RawMessage `json:"data"`

  Data *Data `json:"-"`
  DataList []*Data `json:"-"`
}

首先将“数据”属性作为 json.RawMessage 解析为变量req ,首先尝试解析为单个元素,然后如果失败尝试解析为数组。

if err := json.Unmarshal(req.rawData, &req.Data); err != nil {
    if err := json.Unmarshal(req.RawData, &req.DataList); err != nil {
        return errors.New("could not parse data")
    } else if len(req.DataList) < 1 {
        return errors.New("empty list")
    }
}

在这种情况下,稍后当我们想要使用这些数据时,我们可以通过len(req.Datalist) >= 1检查rawData是单个元素还是数组。 (或者我可以在解析时设置一些标志来显示结构中的isDataMultiple )。

除了我正在做的事情之外,有没有什么惯用的方法可以在 Go 中实现相同的结果?

这是我将如何做到的:

type Request struct {
   RawData json.RawMessage `json:"data"`  // export field for unmarshal of entire request
   DataList []*Data `json:"-"`           // always use slice
}

// Is it an array?
if bytes.HasPrefix(bytes.TrimSpace(req.RawData), []byte{'['})) {
   if err := json.Unmarshal(req.RawData, &req.DataList); err != nil {
       // handle error parsing array
   }
} else {
   var v Data
   if err := json.Unmarshal(req.RawData, &v); err != nil {
       // handle error parsing single value
   }
   req.DataList = []*Data{&v)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM