一个请求 ISBN 查询 API 的服务,查询信息的字段是:
type info struct {
ISBN string `json:"isbn"`
Title string `json:"title"`
Subtitle string `json:"subtitle"`
Pic string `json:"pic"`
Author string `json:"author"`
Summary string `json:"summary"`
Publisher string `json:"publisher"`
Pubplace string `json:"pubplace"`
Page int `json:"page"`
Price string `json:"price"`
Binding string `json:"binding"`
Keyword string `json:"keyword"`
Edition string `json:"edition"`
Impression string `json:"impression"`
Language string `json:"language"`
Format string `json:"format"`
Class string `json:"class"`
}
这里的 page 最初我写了 string 类型,然后解析报错了json: cannot unmarshal number into Go value of type string
然后我改为了 int 类型,然后依然会时不时报错json: cannot unmarshal string into Go struct field info.page of type int
???昨天报错了几次,之后却一直正常想复现都不行,今天又报错了。查验了那个 ISBN API 应该没有问题,给的 page 就是 integer
但是这里报错后却插入数据库了,逻辑是这样的:
func get(isbn string) (*info, error) {
url := baseURL + isbn
resp, err := nic.Get(url, nil)
if err != nil {
return nil, err
}
t := &tmp{0, "", &info{}}
err = resp.JSON(t) //***************************************** error here
if err != nil {
return nil, err
}
if t.Status != 0 {
return nil, errors.New(t.Msg)
}
return t.Result, nil
}
func query(c *mgo.Collection, isbn string) (*info, error) {
data := &info{}
c.Find(bson.M{"isbn": isbn}).One(data)
if data.ISBN == "" {
var err error
data, err = get(isbn)
if err != nil {
return nil, err
}
err = c.Insert(data)
if err != nil {
return nil, err
}
}
return data, nil
}
而且第一次报错后插入数据库的数据却是正确的,page 就是正确的 integer:
{'isbn': '9787212053937', 'page': 236, 'price': '21.50', 'binding': '', 'keyword': '', 'edition': '', 'impression': '', 'language': '', 'format': '', 'class': ''}
orz
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.