2016-08-05 151 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

謝謝。我知道必須有一個更簡單的方法。 –