2015-09-22 14 views
5

Sonra ana i kodGit: json.Unmarshal struct return hatası ne zaman olacak?

var jsonString string = `{"status":false}` 
var a A 
error := json.Unmarshal([]byte(jsonString),&a) 

görünüşte kodu üzerinde bir sıfır hata üretmek i var

type A struct{ 
    name string`json:"name"` 
} 

gibi bir yapı olduğunu varsayalım, bağımsız json biçimi farklıdır. Go json.Unmarshal() dönüş hatası ne zaman olacak?

+1

[Bu gibi] (http://play.golang.org/p/ywOPSds8zQ) çalışan veya en azından derleyen bir örnek yapmak istersiniz. "Unmarshal", giriş geçerli bir JSON olmadığı zaman ("false" değerini "hello" olarak değiştirirse veya close brace'ı kaldırdığında) bir hata döndürür. – twotwotwo

+0

Hepsi açık kaynak, Unmarshal'ın uygulamasını da her zaman kontrol edebilirsiniz: https://golang.org/src/encoding/json/decode.go?s=2621:2669#L64 (ve checkValid: https://golang.org /src/encoding/json/scanner.go?s=732:781#L16) –

cevap

14

JSON kod çözücü, kaynaktaki değerler hedef değerlere uymuyorsa bir hata bildirmiyor. Örneğin, kaynak "durum" alanını içeriyorsa bir hata değildir, ancak hedef bu değil.

dizimi hatayı

type A struct { 
    Name string `json:"name"` 
} 
data = []byte(`{"name":what?}`) 
err = json.Unmarshal(data, &a) 
fmt.Println(err) // prints character 'w' looking for beginning of value 

tür uyuşmazlığı

data := []byte(`{"name":false}`) 
type B struct { 
    Name string `json:"name"` 
} 
var b B 
err = json.Unmarshal(data, &b) 
fmt.Println(err) // prints cannot unmarshal bool into Go value of type string 

playground example

4

Ve daha fazla örnek bir hata döndürür json.Unmarshal() zaman (:

unmarshal fonksiyonu diğer durumlarda hataları dönmek yok özelliğinin yanı sıra Ying geçersiz JSON):

:

err = json.Unmarshal([]byte(`{"name":"a"}`), i) 
fmt.Println(err) // json: Unmarshal(non-pointer int) 

hedef işaretçi olarak nil belirtme: içine unmarshal olmayan bir işaretçi belirtilmesi

i := 0 
err := json.Unmarshal(nil, &i) 
fmt.Println(err) // unexpected end of JSON input 

:

bir nil veya empty dilim Belirlenmesi

err = json.Unmarshal([]byte(`{"name":"a"}`), nil) 
fmt.Println(err) // json: Unmarshal(nil) 

JSON numaralarını belirtme th Hedef türünü taşar. json.Unmarshal() ait doktor alıntı: JSON numarası hedef türü taşıyor ise

JSON değer verilen bir hedef türü için uygun değilse, ya unmarshal bu alanı atlar ve mümkün olan en iyi şekilde unmarshalling tamamlar. Daha ciddi hatalarla karşılaşılmazsa, Unmarshal en eski hatayı açıklayan bir UnmarshalTypeError döndürür.

Bunu göstermek için: Bir daktilo nil pointer içine unmarshal denerseniz

var j int8 
err = json.Unmarshal([]byte(`1112`), &j) 
fmt.Println(err) // json: cannot unmarshal number 1112 into Go value of type int8 
1

icza cevabı eklemek için ayrıca bir hata alabilir. Bu, örneğin, belirli bir tür için bir işaretçi dilim yaparsanız, daha sonra, bu işaretçilerden belirli bir tanesini deneyin ve unmarshal, oluşabilir.

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type Example struct {Name string} 


func main() { 
     exs := make([]*Example, 5) 
     err := json.Unmarshal([]byte(`{"name":"jane"}`), exs[0]) 
     fmt.Println(err) 
} 
// json: Unmarshal(nil *main.Example) 
İlgili konular