jowan
V2EX  ›  问与答

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

  •  
  •   jowan · Feb 10, 2021 · 1957 views
    This topic created in 1942 days ago, the information mentioned may be changed or developed.

    数据结构 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 replies    2021-02-10 15:53:26 +08:00
    awm47
        1
    awm47  
       Feb 10, 2021
    代码不全,应该是自己代码的问题,可以看以下例子。
    ```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  
       Feb 10, 2021
    写个完整点的代码可以吗? 你现在的代码应该跟你预期的是一样的
    jowan
        3
    jowan  
    OP
       Feb 10, 2021
    谢谢 测试 你这样确实没问题
    但是我这边 还有一个方法 调用 FormatJson() 这样就会多一层[]

    ```
    func FormatJson(code int, data interface{}) {
    str, _ : = json.Marshal(JsonResponse{
    Code: code,
    Data: data,
    })
    }
    ```
    jowan
        4
    jowan  
    OP
       Feb 10, 2021
    @daimazha 是的 如果多套一层方法就会多一层[]
    march1993
        5
    march1993  
       Feb 10, 2021 via iPhone
    data 定义呢
    6IbA2bj5ip3tK49j
        6
    6IbA2bj5ip3tK49j  
       Feb 10, 2021
    写个最小复现的 demo 吧。压根不存在你问的问题。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1352 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 17:11 · PVG 01:11 · LAX 10:11 · JFK 13:11
    ♥ Do have faith in what you're doing.