由于目标数据可由键值对组成,使用map结构更清晰
package main
import (
"encoding/json"
"fmt"
)
type myLists struct {
FristName string `json:"frist_name"`
Lists []UserLists `json:"lists"`
}
type UserLists struct {
Id int `json:"id"`
Username string `json:"username"`
Age string `json:"age"`
}
var jsonStr = `[{"id": 1, "username": "xx", "age": "xx", "frist_name": "a"},{"id": 2, "username": "xx", "age": "xx", "frist_name": "b"},{"id": 3, "username": "xx", "age": "xx", "frist_name": "a"}]`
func main() {
var lists []UserLists
err := json.Unmarshal([]byte(jsonStr), &lists)
if err != nil {
fmt.Println("error:", err)
}
//1. id --> user 通过id查找
users := make(map[int]UserLists)
for _, v := range lists {
users[v.Id] = v
}
//2. firstName-> id 映射
var mList []struct {
Id int `json:"id"`
FristName string `json:"frist_name"`
}
err = json.Unmarshal([]byte(jsonStr), &mList)
if err != nil {
fmt.Println("error:", err)
}
//3,firstName -> []UserLists
m := make(map[string][]UserLists)
for _, v := range mList {
if _, ok := m[v.FristName]; !ok {
m[v.FristName] = []UserLists{users[v.Id]}
continue
}
m[v.FristName] = append(m[v.FristName], users[v.Id])
}
//4. 将m转为 myLists结构体
my := []myLists{}
for k, v := range m {
my = append(my, myLists{FristName: k, Lists: v})
}
// 结构体
fmt.Printf("%+v", my)
// json
fmt.Println()
b, err := json.Marshal(my)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
}
打印效果
[{FristName:a Lists:[{Id:1 Username:xx Age:xx} {Id:3 Username:xx Age:xx}]} {FristName:b Lists:[{Id:2 Username:xx Age:xx}]}]
[{"frist_name":"a","lists":[{"id":1,"username":"xx","age":"xx"},{"id":3,"username":"xx","age":"xx"}]},{"frist_name":"b","lists":[{"id":2,"username":"xx","age":"xx"}]}]