Go 运行时确定结构时JSON解组

Go 运行时确定结构时JSON解组,go,Go,通常我们在Go中解组json对象,如下所示: 我是一个围棋迷,所以如果下面有些语法不正确,请原谅 type Item struct { Quantity int `json:"quantity,omitempty"` Price float64 `json:"price,omitempty"` Currency string `json:"currency,omitempty"` } output := &Item{} err:=

通常我们在Go中解组json对象,如下所示:

我是一个围棋迷,所以如果下面有些语法不正确,请原谅

type Item struct {
    Quantity    int     `json:"quantity,omitempty"`
    Price       float64 `json:"price,omitempty"`
    Currency    string  `json:"currency,omitempty"`
}
output := &Item{}
err:= json.Unmarshal([]byte(data), output)
现在需要注意的是,我的json在运行时可能会有所不同,这取决于某些字段。价格可以是字符串、具有不同值的数组或在一个对象中包含货币和价格的json

我在数据库中有这个映射,我如何编写代码,以便读取列名到类型的映射,然后在运行时创建合适的结构来解组它。例如,我需要在同一代码中解组以下JSON:-

{"Quantity": 5, "Price": 64.5, "Currency": "USD"}
{"Quantity": 5, "Purchase": {"Price": 64.5, "Currency": "USD"}}
我已经在数据库中为第二个JSON创建了类似
Quantity->int,Purchase->JSON String
的映射

tl;dr

需要解组json,其中结构在运行时根据一些参数发生变化,我以前就知道结构

编辑:重新措辞

我需要一个函数,它将返回上面结构的对象,并将json字符串和json格式字符串作为输入

CustomUnmarshal([]byte(data) []byte, format string) (*item){}
我在这里编写了一个示例代码:-


如果输出结构和输入中的键保持不变,则可以使用
解组器
界面执行所需操作

type Unmarshaler interface {
        UnmarshalJSON([]byte) error
}
我已经实现了一个非常粗糙的、只有字符串的结构实现

type Item struct {
    Quantity string `json:"quantity,omitempty"`
    Price    string `json:"price,omitempty"`
    Currency string `json:"currency,omitempty"`
}
就像我说的,它非常粗糙,有很多假设,没有检查

func (itm *Item) UnmarshalJSON(byt []byte) (err error) {
    jsn := string(byt)
    jsn = strings.Replace(jsn,"{","",-1)
    jsn = strings.Replace(jsn,"}","",-1)

    jsnArr := strings.Split(jsn,":")
    fmt.Println(jsnArr)

    for i, val := range jsnArr {
        switch {
        case strings.Contains(val,"Quantity"):
            itm.Quantity = strings.Split(jsnArr[i+1],",")[0]
        case strings.Contains(val,"Price"):
            itm.Price = strings.Split(jsnArr[i+1],",")[0]
        case strings.Contains(val,"Currency"):
            itm.Currency = strings.Split(jsnArr[i+1],",")[0]    
        }
    }
    return
}


还请注意,您为结构设置的json标记表示json输入键应该是什么样子的,因此像
“Quantity”
这样的键应该是json输入中的
“Quantity”
,等等。

请提供一个可运行的代码段:现在开始-列出的两种情况是您唯一可能的输入吗?还是有其他可能的形式<代码>{“数量”:5,“价格”:64.5,“货币”:“美元”}{“数量”:5,“采购”:{“价格”:64.5,“货币”:“美元”}@johnperayil还有其他可能的格式。这就是为什么我想写一些通用的东西,而不是每次都写代码,我们有一个新的集成。所以字符串解析是唯一的解决方案。谢谢你的回答。