2016-08-05 147 views
1

我试图将JSON解组到一个结构,但它证明是困难的,因为外部的JSON密钥更改,我只开始了一个星期前。这是我的手动尝试:Golang - Unmarshall与更改键值的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,&装置)?

回答

6

您有一系列JSON对象,映射到每个Device的唯一ID。解组是为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

+0

谢谢。我知道必须有一个更简单的方法。 –