2015-07-21 24 views
0

我爲我的ID的自定義類型:MarshalJSON錯誤的,無效的文字「G」後,頂級

type ID uint 

func (id ID) MarshalJSON() ([]byte, error) { 
    e, _ := HashIDs.Encode([]int{int(id)}) 
    fmt.Println(e) /// 34gj 
    return []byte(e), nil 
} 

func (id *ID) Scan(value interface{}) error { 
    *id = ID(value.(int64)) 
    return nil 
} 

我用HashIDs包編碼我的ID,這樣用戶將無法上閱讀客戶端。但我發現了這個錯誤:

json: error calling MarshalJSON for type types.ID: invalid character 'g' after top-level value

+1

你能提供更多的代碼嗎?那個錯誤發生在哪裏? – RoninDev

回答

7

34gj不是有效的JSON,因此不是你的ID的有效字符串表示。您可能想用雙引號將其包裹起來,以表明這是一個字符串,即返回"34gj"

嘗試:

func (id ID) MarshalJSON() ([]byte, error) { 
    e, _ := HashIDs.Encode([]int{int(id)}) 
    fmt.Println(e) /// 34gj 
    return []byte(`"` + e + `"`), nil 
} 

http://play.golang.org/p/0ESimzPbAx

代替手工做的,你也可以撥打編組爲字符串,通過簡單地用return json.Marshal(e)更換你的回報。

我的猜測是invalid character 'g'在你的錯誤是由於初始部分值被視爲一個數字,然後出現意想不到的字符。

+0

是的,它可能...我已經把編組包裹在自己的「」中,但不知道爲什麼會發生這種情況......無論如何,這解決了它,謝謝 –

+0

我希望這種行爲有更好的解釋 –

+2

Emad,它不能用'''自動包裝它,因爲通過實現編組器,你應該提供一個有效的原始JSON,例如,你可以返回'{「id」:「abc」}'(不是顯然用引號包裝它是錯誤的,你可以在你的代碼中使用'return json.Marshal(e)'來提供一個有效的字符串表示而不用擔心引號(把這個註釋加到我的答案中) – tomasz