多级Unmarshall JSON,可改变键值。

问题描述 投票:-2回答:1

我看过一些帖子,比如 这个 解决了在不同键上取消标记的问题。然而,当我有多个图层时,我似乎很难理解如何做到这一点。

这是我想取消标记的内容。

{"chainlink":{"usd":3.75}}然而,这两个... chainlinkusd 可以是不同的。

我现在的方法是这样的。

type cryptoCurrency struct {
    Currency cryptoCurrencyResult `json: "chainlink,JPY,gold,apple"`
}

type cryptoCurrencyResult struct {
    Usd float64 `json: "usd,USDT,peso"`
}

(以上显然是错误的)

然后使用它们。

var crypto cryptoCurrency
json.Unmarshal(data, &crypto)

但同样的,数据也可能是这样的:

{"chainlink":{"usd":3.75}}
{"JPY":{"USDT":1000}}
{"gold":{"peso":100}}
{"apple":{"usd":1.35}}

目前在SO上的解决方案似乎是倾向于单层的解映射。

go struct unmarshalling
1个回答
1
投票

我的一些假设和建议。

  1. 你不应该丢失关于密码类型的数据 即是否是链克,日元,黄金,或者苹果。
  2. 你可能还需要考虑到货币,然后在你的程序中把所有的东西转换成标准货币。(我在方案中以美元为标准)
  3. 我还假设你的JSON结构仅限于你在例子中显示的内容。如果有更多的键,解决方案(当然)会有一点变化。

你可以为结构使用一个自定义的unmarshal,像下面这样。

type cryptoCurrency struct {
    Type       string
    PriceInUSD float64
}

func (c *cryptoCurrency) UnmarshalJSON(data []byte) error {
    var tmp map[string]map[string]float64
    json.Unmarshal(data, &tmp)
    for k, v := range tmp {
        c.Type = k
        switch {
        case v["usd"] != 0.0:
            c.PriceInUSD = v["usd"]
        case v["USDT"] != 0.0:
            // Convert into USD... same for peso
        }
    }
    return nil
}

下面是一个工作示例 去游乐场.

© www.soinside.com 2019 - 2024. All rights reserved.