将JSON字符串取消编组为具有接口的数组



输入:

"data": {
"filter": [
"["EQ","foo",0],["LIKE","baz","%.2%"],["IN","bar",[1,5,9,11]],["EQ","myBool",true]"
],
"limit": [
"101"
],
"offset": [
"0"
],
"sort": [
"id:ASC"
]
}

结构:

type MyStruct struct {
Operator string
Field    string
Values   []interface{} //this could be an array of strings or int64
}

测试代码:

var parsed [][]interface{}
var parsedValues []MyStruct
if err := json.Unmarshal([]byte(filters), &parsed); err != nil {
fmt.Println("FAILED TO UNMARSHALL FILTERS : " + err.Error())
}
for _, y := range parsed {
var myStuff MyStruct
var values []interface{}
for idx2, col := range y {
if idx2 == 0 {
myStuff.Operator = col.(string)
} else if idx2 == 1 {
myStuff.Field = col.(string)
} else {
values = append(values, col)
}
}
myStuff.Values = values
parsedValues = append(parsedValues, criteria)
}

编辑:

我在取消封送处理时遇到错误。

FAILED TO UNMARSHALL FILTERS : invalid character ',' after top-level value

这个字符串中数组之间的逗号会扰乱解析吗?我试着做了一个替换来删除每个子数组之间的逗号。。。但是现在,它只是对[.]大喊大叫

也许这完全是错误的做法。我以为下面的答案会起作用,但根据我的输入,它没有起作用。我不能100%确定断开在哪里。

如有任何帮助,我们将不胜感激。

这看起来像是你在试图解组:

["IN","id", 342]

进入

type MySearchCriteria struct {
Operator string
Field    string
Values   []interface{} //this could be an array of strings or int64
}

您对解组的期望是按顺序填充结构的字段吗?如果是这样,那就行不通了。

要解组JSON数组,必须使用一个数组:

var flt []interface{}
json.Unmarshal(b, &flt)

然后你可以做:

operator:=flt[0].(string)
field:=flt[1].(string)
inumbers:=make([]int64,0)
strvalues:=make([]string,0)
for i:=2;i<len(flt);i++ {
if number, ok:=flt[i].(float64); ok {
inumbers=append(inumbers,int64(number))
} else if str, ok:=flt[i].(string); ok {
strvalues=append(strvalues,str)
}
}

最新更新