golang解析api返回json问题

fbbin
  • 740

现在在用golang写一个http客户端,来请求HTTP返回的json,但是每个接口返回的格式都是一样的如:

{"code": 0,"data": [],"message": "Success"}

像这种格式的话 我们如果定义一个struct或者map都可以通过json.Unmarshal解析出来,但是关键是这个data里面的东西,每个接口里面的结构是不一样的,那么这个有没有什么统一的处理方法呢?
如果说 定义一个如:

type Result struct {
        Code    int    `json:"code"`
        Data    interface{} `json:"data"`
        Message string `json:"message"`
    }

或者map[string]interface{},这种的话 那么这个iterface{}怎么处理data里面的数据呢
比如一个接口返回的数据:

{"code": 0,"data": [{"item": 210263,"status": 0}],"message": "Success"}
{"code": 0,"data": ["cont": 210263,"list": [xxxxxx]}],"message": "Success"}

这种有什么方法可以通用处理么?

回复
阅读 7.9k
5 个回答

我一般是这样的:

type BaseResponse struct {
    Code    int    `json:"code"`
    Message string `json:"message"`
}

func (br BaseResponse) Success() bool {
    return br.Code == 0 && br.Message == "success"
}

type AResponse struct {
    BaseResponse
    Data []AData
}

type BResponse struct {
    BaseResponse
    Data BData
}

这样也没什么麻烦的,其实似乎并没有通用的方法,在后面你还是要单独处理不同类型的数据,解析不同格式的Data,类型转换,倒不如一次性定义好,能很大程度上避免出错

bill
  • 2
新手上路,请多包涵

主要看你想不想预定义data的结构了。
如果接口就几种,并且你知道每次请求的是哪个接口,你后续还要对data进行处理,那么其实给每种都定义一个结构就完了。

要是你只是过一次手,把data解析出来给别人,那就用大家说的simplejson可以有类似动态语言的效果。

vclass
  • 2
新手上路,请多包涵

建议用simplejson这个包,先找到你要解析的数据相应的数组或者map,然后直接转就好了,不用定义struct。

宣传栏