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

在 Go 中将对象转换为对象数组 (JSON)

在 Go 中将对象转换为对象数组 (JSON)

Go
胡子哥哥 2022-11-28 14:39:15
我正在将 JS API 转换为 Go。我使用来自第三方的数据,其中有时属性是各种键、值的对象而不是对象数组(键、值)。所以在我的前端,如果它是一个对象,它不会渲染,所以我将它转换成一个对象数组。目前在 JS 我正在这样做:if (!Array.isArray(data.attributes)) {      // convert into array of objects; only works for non separate key:key value:value      data.attributes = Object.entries(data.attributes).map(        ([key, value]) => ({          type: key,          value: value,        })      );    }data是 JSON 响应中的一个属性,例如: {... data: { "attributes": [{...}{...}]}所以偶尔属性会是{... data: { "attributes": {name: "John", age: "20" }:我将如何在 Go 中做这样的事情?谢谢。
查看完整描述

1 回答

?
尚方宝剑之说

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

使用声明的类型,您可以实现json.Unmarshaler接口以自定义 JSON 的解组方式。


{在实现中,您可以通过简单地查看第一个和最后一个字节来查看它是-and-}还是[-and-来检查 JSON 数据是否表示对象或数组]。根据该检查,您可以决定如何进一步进行,下面是一个示例:


type Attr struct {

    Type  string

    Value interface{}

}


type AttrList []Attr


func (ls *AttrList) UnmarshalJSON(data []byte) error {

    if len(data) == 0 { // nothing to do

        return nil

    }


    switch last := len(data)-1; {

    // is array?

    case data[0] == '[' && data[last] == ']':

        return json.Unmarshal(data, (*[]Attr)(ls))


    // is object?

    case data[0] == '{' && data[last] == '}':

        var obj map[string]interface{}

        if err := json.Unmarshal(data, &obj); err != nil {

            return err

        }

        for key, value := range obj {

            *ls = append(*ls, Attr{Type: key, Value: value})

        }

        return nil

    }


    return errors.New("unsupported JSON type for AttrList")

}

https://go.dev/play/p/X5LV8G87bLJ


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 334 浏览
慕课专栏
更多

添加回答

举报

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