我正在尝试将JSON解组到结构中,但是事实证明这很困难,因为外部JSON密钥发生了变化,而我才在一周前才开始使用。这是我的手动尝试:
import ( "encoding/json" "fmt" "strconv" ) type Device struct { localUUID string applicationUUID string externalUUID string commit string lastSeen string state string progress float32 } func main() { devices := make([]*Device, 0, 10) b := []byte(`{ "5417871461137421886": { "applicationUUID": "test_applicationUUID", "commit": "test_commit", "lastSeen": "test_lastSeen", "localUUID": "E4:F5:13:8E:F5:43", "progress": "3.5", "externalUUID": "test_externalUUID", "state": "test_state" }, "5632882567440442530": { "applicationUUID": "test_applicationUUID", "commit": "test_commit", "lastSeen": "test_lastSeen", "localUUID": "E4:F5:13:8E:F5:42", "progress": "3.5", "externalUUID": "test_externalUUID", "state": "test_state" }, "8912255216147730520": { "applicationUUID": "test_applicationUUID", "commit": "test_commit", "lastSeen": "test_lastSeen", "localUUID": "E4:F5:13:8E:F5:41", "progress": "3.5", "externalUUID": "test_externalUUID", "state": "test_state" } }`) var f interface{} json.Unmarshal(b, &f) outer := f.(map[string]interface{}) for _, value := range outer { inner := value.(map[string]interface{}) device := &Device{} device.localUUID = inner["localUUID"].(string) device.applicationUUID = inner["applicationUUID"].(string) device.externalUUID = inner["externalUUID"].(string) device.commit = inner["commit"].(string) device.lastSeen = inner["lastSeen"].(string) device.state = inner["state"].(string) f, _ := strconv.ParseFloat(inner["progress"].(string), 32) device.progress = float32(f) devices = append(devices, device) } for _, device := range devices { fmt.Println(device) } }
有没有一种方法可以忽略键并遍历值,从而允许我使用json.Unmarshal(b,&Device)?
您有一系列JSON对象, 将 一个唯一的ID 映射 到每个Device。将其解组为map
Device
map
type Device struct { LocalUUID string `json:"localUUID"` ApplicationUUID string `json:"applicationUUID"` ExternalUUID string `json:"externalUUID"` Commit string `json:"commit"` LastSeen string `json:"lastSeen"` State string `json:"state"` Progress float32 `json:"progress,string"` } func main() { devices := make(map[string]*Device) err := json.Unmarshal(b, &devices) if err != nil { log.Fatal(err) } for _, device := range devices { fmt.Printf("%#v\n", device) } }
https://play.golang.org/p/JDZzG64jJR