2017-06-19 36 views
0

我得到的一些JSON數據在鍵名中有空格。我正在使用標準的encoding/json庫來解組數據。但是它無法理解模式中帶有空格的鍵。對於例如下面的代碼:無法解密與具有空格的鍵名稱的JSON

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    var jsonBlob = []byte(`[ 
     {"Na me": "Platypus", "Order": "Monotremata"}, 
     {"Na me": "Quoll", "Order": "Dasyuromorphia"} 
    ]`) 
    type Animal struct { 
     Name string `json: "Na me"` 
     Order string `json: "Order,omitempty"` 
    } 
    var animals []Animal 
    err := json.Unmarshal(jsonBlob, &animals) 
    if err != nil { 
     fmt.Println("error:", err) 
    } 
    fmt.Printf("%+v", animals) 
} 

給人的輸出爲:

[{Name: Order:Monotremata} {Name: Order:Dasyuromorphia}] 

所以在架構庫中的空間(從那幺),並嘗試找到鑰匙(名稱)這顯然不存在。任何建議我可以在這裏做什麼?

回答

5

jsontag specification不正確,這就是爲什麼encoding/json庫默認爲是Name字段名。但由於"Name"鍵沒有JSON字段,因此Animal.Name將保持其零值(這是空字符串"")。

解組Order仍然有效,因爲json包將使用字段名稱,如果json缺少標籤說明(嘗試使用大寫和小寫)。由於字段名稱與JSON密鑰相同,因此不需要額外的JSON標籤映射。

你不能在標籤說明書中的空間冒號後和引號前:

type Animal struct { 
    Name string `json:"Na me"` 
    Order string `json:"Order,omitempty"` 
} 

有了這個簡單的變化,它的工作原理(嘗試在Go Playground)

[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}] 
+0

哎喲,那個解決了,謝謝。但是還是完全不明白。爲什麼順序鍵在這種情況下工作... –

+0

啊明白了,這裏順序鍵名與模式相同 –

+0

@MangatRaiModi是的,也編輯了答案 – icza

相關問題