Jzin 2024-02-26 15:44 采纳率: 60%
浏览 12

gin框架如何接收不同类型的json

gin框架如何接口post请求中 不同类型的json参数
比如传{"id":"1"}

我的struct是

type IdReq struct {
    Id      int  `json:"id"`
}

使用 **ShouldBindJSON** **Bind** **BindJSON**
或者映射到**map[string]interface{}**中 再进行**json.Marshal** **json.Unmarshal** 都会报类型的错误

**json: cannot unmarshal string into Go struct field testat.age of type int**

有什么办法能无感映射到struct中?

  • 写回答

5条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-02-26 15:46
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如需一对一服务私聊我哦
    针对这个问题,可以使用类型断言(type assertion)来解决。具体做法是将接收到的json数据映射到一个空接口(interface{})中,然后通过类型断言将其转成需要的具体类型。例如,下面的代码演示了如何将接收到的json数据映射到一个空接口中,并通过类型断言将其转成需要的具体类型:
    type IdReq struct {
        Id int `json:"id"`
    }
    func exampleHandler(c *gin.Context) {
        var req interface{}
        if err := c.ShouldBindJSON(&req); err != nil {
            // handle error
        }
        var idReq IdReq
        switch r := req.(type) {
        case map[string]interface{}:
            if id, ok := r["id"].(float64); ok {
                idReq.Id = int(id)
            }
        case []byte:
            if err := json.Unmarshal(r, &idReq); err != nil {
                // handle error
            }
        default:
            // handle error
        }
        // use idReq
    }
    

    在上面的示例代码中,我们首先使用ShouldBindJSON将json数据映射到一个空接口req中。然后,我们使用type switch语句将接口req转换成真正需要的IdReq类型。 具体地,如果req是一个map[string]interface{}类型,那么我们可以使用类型断言将其中的id字段转换成float64类型,再将其转换成我们需要的int类型,赋值给idReq.Id。如果req是一个[]byte类型,则我们可以使用json.Unmarshal函数将其转换成IdReq类型。 使用这种方法可以实现与互联网上各种异构系统无缝通信,适用性更强。

    评论

报告相同问题?

问题事件

  • 修改了问题 2月26日
  • 创建了问题 2月26日

悬赏问题

  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错