淘宝,京东的api调用返回的json格式跟golang的标准库encoding/json中的格式不兼容。
淘宝有些地方习惯性的把float数据加""变成字符串格式
比如
"delivery_score": "0.0",
文档上的又不一样
"delivery_score": 90,
京东的习惯是,不管是不是字符串类型都都加"",变成字符串类型的。
这样就造成标准库无法识别这些格式,
我把json拷贝出来,在decode.go文件的661行的literalStore函数种修改了:字符串处理方式代码如下:
case '"': // string
s, ok := unquoteBytes(item)
if !ok {
if fromQuoted {
d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
} else {
d.error(errPhase)
}
}
num := string(item[1 : len(item)-1]) //value字符串
switch v.Kind() {
default:
d.saveError(&UnmarshalTypeError{"string", v.Type()})
case reflect.Slice:
if v.Type() != byteSliceType {
d.saveError(&UnmarshalTypeError{"string", v.Type()})
break
}
b := make([]byte, base64.StdEncoding.DecodedLen(len(s)))
n, err := base64.StdEncoding.Decode(b, s)
if err != nil {
d.saveError(err)
break
}
v.Set(reflect.ValueOf(b[0:n]))
case reflect.String:
v.SetString(string(s))
case reflect.Interface:
if v.NumMethod() == 0 {
v.Set(reflect.ValueOf(num))
} else {
d.saveError(&UnmarshalTypeError{"string", v.Type()})
}
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: //整数处理
n, err := strconv.ParseInt(num, 10, 64)
if err != nil || v.OverflowInt(n) {
d.saveError(&UnmarshalTypeError{"number " + num, v.Type()})
break
}
v.SetInt(n)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr://无符号整数处理
n, err := strconv.ParseUint(num, 10, 64)
if err != nil || v.OverflowUint(n) {
d.saveError(&UnmarshalTypeError{"number " + num, v.Type()})
break
}
v.SetUint(n)
case reflect.Float32, reflect.Float64://浮点数处理
n, err := strconv.ParseFloat(num, v.Type().Bits())
if err != nil || v.OverflowFloat(n) {
d.saveError(&UnmarshalTypeError{"number " + num, v.Type()})
break
}
v.SetFloat(n)
}
有疑问加站长微信联系(非本文作者)