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

2021-02-10 10:15:13 +08:00
 jowan

数据结构 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 处理不太熟悉 还请各位大佬指导

1214 次点击
所在节点    问与答
6 条回复
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
2021-02-10 10:30:25 +08:00
写个完整点的代码可以吗? 你现在的代码应该跟你预期的是一样的
jowan
2021-02-10 11:24:30 +08:00
谢谢 测试 你这样确实没问题
但是我这边 还有一个方法 调用 FormatJson() 这样就会多一层[]

```
func FormatJson(code int, data interface{}) {
str, _ : = json.Marshal(JsonResponse{
Code: code,
Data: data,
})
}
```
jowan
2021-02-10 11:27:05 +08:00
@daimazha 是的 如果多套一层方法就会多一层[]
march1993
2021-02-10 11:49:33 +08:00
data 定义呢
6IbA2bj5ip3tK49j
2021-02-10 15:53:26 +08:00
写个最小复现的 demo 吧。压根不存在你问的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752761

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX