Golang – Zurückgegebene JSON-Felder der obersten Ebene sind veränderbar. Wie man es in einer Struktur verwendet

WBOY
Freigeben: 2024-02-06 10:45:03
nach vorne
419 Leute haben es durchsucht

Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用

问题内容

我有一个来自 API 的 JSON 响应,如下所示:

{
    "1091500": {
      "data": {
        "price_overview": {
          "final_formatted": "$59.99"
        }
      } 
    }
}
Nach dem Login kopieren

当我解组并访问我需要的价格值时,我的结构工作正常。 price.AppID.Data.PriceOverview.FinalFormatted

此处的结构:

type SteamApp struct {
    AppID struct {
        Data struct {
            PriceOverview struct {
                FinalFormatted string `json:"final_formatted"`
            } `json:"price_overview"`
        } `json:"data"`
    } `json:"1091500"`
}
Nach dem Login kopieren

我正在尝试解决的是顶级密钥“1091500”。这是由单独函数生成的值,实际上是获取上述数据所需的搜索词。话虽这么说,它是动态的,并且是在运行时通过单独的 API 调用发现的。因为您需要结构中的 JSON 标记,所以我正在努力想出一种方法来概括它。

到目前为止,最好的方法是找到一个以不同方式返回数据的不同 API,但我还没有找到。我还考虑过找到一种方法来“跳过”初始部分,因为我有正确的数据,这只是“阅读”它的问题。预先感谢您,我希望我能很好地解释自己。


正确答案


分两步解组。首先进入映射,然后进入结构类型。您可以通过实现 json.Unmarshaler 自动执行此操作:

package main

import (
    "encoding/json"
    "fmt"
)

var j = []byte(`{
    "1091500": {
      "data": {
        "price_overview": {
          "final_formatted": "$59.99"
        }
      }
    }
}`)

func main() {
    var t T
    err := json.Unmarshal(j, &t)

    fmt.Println(err)
    fmt.Printf("%+v\n", t)
}

type T struct {
    AppID         string `json:"-"`
    PriceOverview struct {
        FileFormatted string `json:"final_formatted"`
    } `json:"price_overview"`
}

func (t *T) UnmarshalJSON(b []byte) error {
    var m map[string]struct {
        Data json.RawMessage
    }

    err := json.Unmarshal(b, &m)
    if err != nil {
        return err
    }

    type T_ T // prevent recursion
    var t_ T_

    for appID, x := range m {
        err := json.Unmarshal(x.Data, &t_)
        if err != nil {
            return err
        }

        *t = T(t_)
        t.AppID = appID

        break
    }

    return nil
}
Nach dem Login kopieren

在操场上尝试一下:https://www.php.cn/link/8571ddcc1c64ca1fa11891d899cab05d

我假设数据属性只是噪音并使其透明。如果我弄错了,请使用 map[string]json.RawMessage 并将数据字段添加到类型 T。

如果您也想自动编组为相同的格式,请实现 json.Marshaler还有:

func (t T) MarshalJSON() ([]byte, error) {
    type T_ T // prevent recursion

    m := map[string]struct {
        Data T_ `json:"data"`
    }{
        t.AppID: {Data: T_(t)},
    }

    return json.Marshal(m)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonGolang – Zurückgegebene JSON-Felder der obersten Ebene sind veränderbar. Wie man es in einer Struktur verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!