我有一個 json 作為以下格式的字串:
{"add": [{"var": ["100"]}, "200"]}
這里的鍵“add”不是所有 json 的常量值。在某些情況下,它可以是“減”、“乘”等。該鍵的值是一個陣列。在這種情況下 [{"var": ["100"]}, "200"]。這意味著應該將 100 添加到現有值 200。
我正在嘗試決議這個運算式。由于主鍵(在本例中為“添加”)不是常量,因此我無法轉換為結構。因此,我通過以下方式將其轉換為 json 物件:
type mathExpVar struct {
valueVar []string `json:"var"`
}
var mathExpJson map[string][]interface{}
var input = "{\"add\": [{\"var\": [\"100\"]}, \"200\"]}"
err := json.Unmarshal([]byte(input), &mathExpJson)
for operator, values := range mathExpJson{
vals, ok := values[0].(mathExpVar) // here values[0] will be {"var": ["100"]}
if !ok{
return nil
}
}
這里'ok'總是回傳false。我不確定為什么。沒有其他錯誤訊息可供我檢查失敗的原因。有人可以幫我解決這個問題嗎?
鏈接到同樣的游樂場:https ://go.dev/play/p/POfQmEoPbjD
uj5u.com熱心網友回復:
一個作業示例:https : //go.dev/play/p/02YzI5cv8vV
在我看來,Burak Serdar 的原始回復無效的全部原因是它沒有考慮到您還需要處理其余引數的事實。如果您仔細觀察,您會發現運算式不是字串陣列,而是不同型別的。此實作處理自定義 Unmarshalling 并將所有額外引數存盤在 Extra 欄位中。
還有代碼:
package main
import (
"encoding/json"
"log"
"reflect"
)
const jsonPayload = "{\"add\": [{\"var\": [\"100\"]}, \"200\"]}"
func main() {
data := MathExpressions{}
err := json.Unmarshal([]byte(jsonPayload), &data)
if err != nil {
log.Println("Failed to unmarshal json, error:", err)
return
}
log.Println(data)
for operation, expression := range data {
log.Print("Op:", operation, "Exp:", expression)
}
log.Println("Finished..")
}
/**
The sub definition for a specific expression in the object
*/
type ExpressionDefinition struct {
Vars []string `json:"var"`
Extra []string
}
func (e *ExpressionDefinition) UnmarshalJSON(data []byte) error {
tokens := make([]interface{}, 0)
err := json.Unmarshal(data, &tokens)
if err != nil {
return err
}
for _, token := range tokens {
log.Println("Processing token:", token, "type:", reflect.TypeOf(token))
switch token.(type) {
case map[string]interface{}:
for _, v := range token.(map[string]interface{})["var"].([]interface{}) {
e.Vars = append(e.Vars, v.(string))
}
case string:
e.Extra = append(e.Extra, token.(string))
}
}
log.Println(tokens)
return nil
}
/**
The main expressions object which contains all the sub-expressions.
*/
type MathExpressions map[string]ExpressionDefinition
uj5u.com熱心網友回復:
這里決議的 json 值的整個結構將存盤在嵌套的map[string]interface{}(json 物件)或[]interface{}(json 陣列)型別中。
在行中:
vals, ok := values[0].(mathExpVar)
values[0]將是 type map[string]interface{},它不能被斷言為mathExpVar,這是一個 struct ,一個完全不同的資料型別。
您需要先鍵入 assert to map[string]interface{},然后在前進的每個嵌套級別中執行此操作:
package main
import (
"encoding/json"
"fmt"
)
func main() {
type mathExpVar struct {
valueVar []string `json:"var"`
}
var mathExpJson map[string][]interface{}
var input = "{\"add\": [{\"var\": [\"100\"]}, \"200\"]}"
err := json.Unmarshal([]byte(input), &mathExpJson)
if err != nil {
fmt.Println("Error in unmarshalling")
}
for _, values := range mathExpJson {
var vals mathExpVar
valMap, ok := values[0].(map[string]interface{})
if ok {
varSlice, ok := valMap["var"].([]interface{})
if ok {
for _, v := range varSlice {
nv, ok := v.(string)
if ok {
vals.valueVar = append(vals.valueVar, nv)
} else {
fmt.Printf("%T\n", v)
}
}
} else {
fmt.Printf("%T\n", valMap["var"])
}
} else {
fmt.Printf("%T\n", values[0])
}
fmt.Printf("% v\n", vals)
}
}
見:https : //go.dev/play/p/Ot_9IZr4pwM
uj5u.com熱心網友回復:
有多個問題:
- valueVar 未匯出:
type mathExpVar struct {
ValueVar []string `json:"var"`
}
- 在地圖中指定型別
var mathExpJson map[string][]mathExpVar
然后你可以這樣做:
for _, values := range mathExpJson {
fmt.Println(values)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417936.html
標籤:
