我有一個(gè)struct包含各種貨幣價(jià)值的東西,以美分(1/100 美元)為單位:type CurrencyValues struct { v1 int `json:"v1,string"` v2 int `json:"v2,string"`} 我想為帶有千位分隔符的貨幣值創(chuàng)建一個(gè)自定義的 json Unmarshaller。這些值被編碼為字符串,帶有一個(gè)或多個(gè)千位分隔符 ( ,),可能還有一個(gè)小數(shù)點(diǎn) ( .)。對(duì)于這個(gè) JSON {"v1": "10", "v2": "1,503.21"},我想 JSON Unmarshal a CurrencyValues{v1: 1000, v2: 150321}。遵循這里的類似答案:Golang: How to unmarshall both 0 and false as bool from JSON,我繼續(xù)為我的貨幣字段創(chuàng)建了一個(gè)自定義類型,其中包括一個(gè)自定義解組函數(shù):type ConvertibleCentValue intfunc (cents *ConvertibleCentValue) UnmarshalJSON(data []byte) error { asString := string(data) // Remove thousands separators asString = strings.Replace(asString, ",", "", -1) // Parse to float, then convert dollars to cents if floatVal, err := strconv.ParseFloat(asString, 32); err == nil { *cents = ConvertibleCentValue(int(floatVal * 100.0)) return nil } else { return err }}但是,在編寫單元測(cè)試時(shí):func Test_ConvertibleCentValue_Unmarshal(t *testing.T) { var c ConvertibleCentValue assert.Nil(t, json.Unmarshal([]byte("1,500"), &c)) assert.Equal(t, 150000, int(c))}我遇到這個(gè)錯(cuò)誤:Error: Expected nil, but got: &json.SyntaxError{msg:"invalid character ',' after top-level value", Offset:2}我在這里錯(cuò)過(guò)了什么?
1 回答

RISEBY
TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
您正在嘗試解組1,500在 JSON 中無(wú)效的字符串。我認(rèn)為您的意思是解組 JSON 字符串"1,500":
assert.Nil(t, json.Unmarshal([]byte(`"1,500"`), &c))
注意反引號(hào)。這是一個(gè)簡(jiǎn)化的示例:
b := []byte(`1,500`)
var s string
err := json.Unmarshal(b, &s)
fmt.Println(s, err) // Prints error.
b = []byte(`"1,500"`)
err = json.Unmarshal(b, &s)
fmt.Println(s, err) // Works fine.
游樂(lè)場(chǎng):http : //play.golang.org/p/uwayOSgmTv。
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報(bào)
0/150
提交
取消