基于param值解码Golang中传入的JSON

基于param值解码Golang中传入的JSON,json,struct,go,Json,Struct,Go,我试图在我用Go编写的RESTAPI中解码传入的JSON。我使用的是decoder.Decode()函数,我的问题是我需要在解码过程中应用特定的规则,因为有时候JSON包含: "type": { "type" : "string", "maxLength" : 30 }, 有时: "type": { "type" : "integer", "max" : 30, "min" : 10 }, 我需要告诉Go“如果type.type是string,请使用此

我试图在我用Go编写的RESTAPI中解码传入的JSON。我使用的是
decoder.Decode()
函数,我的问题是我需要在解码过程中应用特定的规则,因为有时候JSON包含:

"type": {
    "type" : "string",
    "maxLength" : 30
},
有时:

"type": {
    "type" : "integer",
    "max" : 30,
    "min" : 10
},
我需要告诉Go“如果type.type是string,请使用此结构(
type\u string struct
),如果type.type是integer,请使用其他结构(
type\u integer struct
)”。我真的不知道怎么做。我想到的一个解决方案是,制作一个具有所有可能属性的通用结构,在任何类型的对象上使用它,然后根据
类型
属性过滤属性,但这太脏了。我想我也可以写我自己的解码器,但这似乎也有点奇怪


我是新手,我已经习惯了JavaScript提供的自由。

首先,如果“type”字段依赖于“type.type”,在我看来,最好将其上移一级。比如:

...
"type" : "integer",
"intOptions": {
    "max" : 30,
    "min" : 10
},
....
myType := new(Type)
json.Unmarshal([]byte(yourJsonString), myType)
然后,您可以仅使用一个字段创建结构:

type Type struct {
    Type string
}
然后做一些类似的事情:

...
"type" : "integer",
"intOptions": {
    "max" : 30,
    "min" : 10
},
....
myType := new(Type)
json.Unmarshal([]byte(yourJsonString), myType)

现在,根据myType的值,您可以使用不同的结构来解码json。

您始终可以解码到接口{},如这里所述:

其思想是解组映射[string]接口{},然后在访问值之前进行强制转换和比较


在上面的代码中,f函数执行强制转换和比较。考虑到这个糟糕的json,我使用了糟糕的变量名t和t2来表示不同深度的“type”json值。t2有了值后,switch语句会对“string”或“integer”执行一些操作,它所做的是打印maxLength或max值。

能否请您详细说明一下这里发生了什么,因为我不确定是否理解这是如何工作的。我知道我的问题的答案是一个界面,因为它似乎是任何人在围棋中遇到的每一个问题的解决方案。谢谢您应该声明结构中所有可能的字段,然后检查每个字段。