V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jowan
V2EX  ›  问与答

json.Marshal 如何去除 interface{}外层的"[]"

  •  
  •   jowan · 2021-02-10 10:15:13 +08:00 · 1043 次点击
    这是一个创建于 1164 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据结构 1

    type User struct {
    	Name string `json:"name"`
    	Age  int    `json:"age"`
    }
    
    user1 := User{
    	Name: "zhangsan",
    	Age:  18,
    }
    
    user2 := User{
    	Name: "lisi",
    	Age:  20,
    }
    
    arr1 := []User{user1, user2}
    

    数据结构 2

    arr2 := []int{1, 2, 3, 4, 5}
    

    封装返回

    type JsonResponse struct {
    	Code int           `json:"code"` 
    	Data interface{}   `json:"data,omitempty"`
    }
    
    str, _ := json.Marshal(JsonResponse{
    	Code:    code,
    	Message: message,
    	Data:    data,
    })
    
    

    数据结构 1 期待返回的结果是

    {
    	"code": 0,
    	"data": [1, 2, 3, 4, 5]
    }
    

    实际返回的是

    {
    	"code": 0,
    	"data": [[1, 2, 3, 4, 5]]
    }
    

    数据结构 2 期待返回的结果是

    {
    	"code": 0,
    	"data": [
    		{"name": "zhangsan", "age": 18},
    		{"name": "lisi", "age": 20}
    	]
    }
    

    实际返回的结果是

    {
    	"code": 0,
    	"data": [
        [
          {
            "name": "zhangsan",
            "age": 18
          },
          {
            "name": "lisi",
            "age": 20
          }
        ]
      ]
    }
    

    data 外面都会套一层[]
    但是 data 数据类型又不是固定的 所以用到了 interface{}

    刚接触 go 对 json 处理不太熟悉 还请各位大佬指导

    6 条回复    2021-02-10 15:53:26 +08:00
    jaynos
        1
    jaynos  
       2021-02-10 10:24:46 +08:00
    代码不全,应该是自己代码的问题,可以看以下例子。
    ```go
    package main

    import (
    "encoding/json"
    "fmt"
    )

    type JsonResponse struct {
    Code int `json:"code"`
    Data interface{} `json:"data,omitempty"`
    }

    func main() {
    data := []int{1, 2, 3, 4, 5}
    bs, _ := json.Marshal(JsonResponse{
    Code: 0,
    Data: data,
    })
    // {"code":0,"data":[1,2,3,4,5]}
    fmt.Printf("%s", bs)
    }
    ```

    话说直接断点调试下不就知道数据对不对了
    daimazha
        2
    daimazha  
       2021-02-10 10:30:25 +08:00
    写个完整点的代码可以吗? 你现在的代码应该跟你预期的是一样的
    jowan
        3
    jowan  
    OP
       2021-02-10 11:24:30 +08:00
    谢谢 测试 你这样确实没问题
    但是我这边 还有一个方法 调用 FormatJson() 这样就会多一层[]

    ```
    func FormatJson(code int, data interface{}) {
    str, _ : = json.Marshal(JsonResponse{
    Code: code,
    Data: data,
    })
    }
    ```
    jowan
        4
    jowan  
    OP
       2021-02-10 11:27:05 +08:00
    @daimazha 是的 如果多套一层方法就会多一层[]
    march1993
        5
    march1993  
       2021-02-10 11:49:33 +08:00 via iPhone
    data 定义呢
    xgfan
        6
    xgfan  
       2021-02-10 15:53:26 +08:00
    写个最小复现的 demo 吧。压根不存在你问的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2777 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:41 · PVG 22:41 · LAX 07:41 · JFK 10:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.