猿问

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

我正在将 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 中做这样的事情?谢谢。


胡子哥哥
浏览 335回答 1
1回答

尚方宝剑之说

使用声明的类型,您可以实现json.Unmarshaler接口以自定义 JSON 的解组方式。{在实现中,您可以通过简单地查看第一个和最后一个字节来查看它是-and-}还是[-and-来检查 JSON 数据是否表示对象或数组]。根据该检查,您可以决定如何进一步进行,下面是一个示例:type Attr struct {    Type  string    Value interface{}}type AttrList []Attrfunc (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
随时随地看视频慕课网APP

相关分类

Go
我要回答