Skip to content

Commit 266f293

Browse files
committed
修复对map多级指针的解析,修改文档
1 parent a292e9d commit 266f293

File tree

6 files changed

+95
-6
lines changed

6 files changed

+95
-6
lines changed

README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,14 @@ func main() {
718718
fmt.Println(string(marshal)) //以下是官方的json解析输出结果:可以看到所有的字段都被解析了出来
719719
//{"uid":1,"nickname":"boyan","avatar":"avatar","sex":1,"vip_end_time":"2023-03-06T23:11:22.622693+08:00","price":"999.9"}
720720

721-
//用法:filter.SelectMarshal("select里的一个场景",这里可以是slice/array/struct/pointer/map)
721+
//用法:filter.Select("select里的一个场景",这里可以是slice/array/struct/pointer/map)
722+
article:=filter.Select("article", user)
723+
articleBytes, _ := json.Marshal(article)
724+
fmt.Println(string(articleBytes)) //以下是通过json-filter 过滤后的json,此输出是article接口下的json
725+
//{"avatar":"avatar","nickname":"boyan","uid":1}
726+
727+
//filter.SelectMarshal 是一个方便测试查看的方法,先过滤,然后再编码成json字符串返回,有错误直接panic,三部操作一气呵成,适合测试查看等
728+
//下面为了方便演示,将使用SelectMarshal api来进行
722729
fmt.Println(filter.SelectMarshal("article", user).MustJSON()) //以下是通过json-filter 过滤后的json,此输出是article接口下的json
723730
//{"avatar":"avatar","nickname":"boyan","uid":1}
724731

@@ -767,7 +774,8 @@ omit则反之,标记的字段会被排除。
767774
这时候你需要调用
768775

769776
```go
770-
f:=filter.OmitMarshal("chat",el) //这时Nickname字段就被排除掉了。
777+
f:=filter.Omit("chat",el) //这时Nickname字段就被排除掉了。
778+
f:=filter.OmitMarshal("chat",el) //同样是是一气呵成的操作,将结构体编码后返回一个对象,可以选择对象的任意形态
771779
```
772780

773781
##### omitempty零值忽略

filter/omit_encode.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,10 @@ TakePointerValue: //取指针的值
124124
}
125125

126126
case reflect.Map:
127+
takeVMap:
127128
if valueOf.Kind() == reflect.Ptr {
128129
valueOf = valueOf.Elem()
130+
goto takeVMap
129131
}
130132
keys := valueOf.MapKeys()
131133
if len(keys) == 0 { //空map情况下解析为{}
@@ -134,14 +136,14 @@ TakePointerValue: //取指针的值
134136
}
135137
for i := 0; i < len(keys); i++ {
136138
mapIsNil := false
137-
takeValMap:
138139
val := valueOf.MapIndex(keys[i])
140+
takeValMap:
139141
if val.Kind() == reflect.Ptr {
140142
if val.IsNil() {
141143
mapIsNil = true
142144
continue
143145
} else {
144-
val = valueOf.MapIndex(keys[i]).Elem()
146+
val = val.Elem()
145147
goto takeValMap
146148
}
147149
}

filter/select_encode.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,10 @@ TakePointerValue: //取指针的值
123123
}
124124

125125
case reflect.Map:
126+
takeVMap:
126127
if valueOf.Kind() == reflect.Ptr {
127128
valueOf = valueOf.Elem()
129+
goto takeVMap
128130
}
129131
keys := valueOf.MapKeys()
130132
if len(keys) == 0 { //空map情况下解析为{}
@@ -133,14 +135,14 @@ TakePointerValue: //取指针的值
133135
}
134136
for i := 0; i < len(keys); i++ {
135137
mapIsNil := false
136-
takeValMap:
137138
val := valueOf.MapIndex(keys[i])
139+
takeValMap:
138140
if val.Kind() == reflect.Ptr {
139141
if val.IsNil() {
140142
mapIsNil = true
141143
continue
142144
} else {
143-
val = valueOf.MapIndex(keys[i]).Elem()
145+
val = val.Elem()
144146
goto takeValMap
145147
}
146148
}

test/main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package main
2+
3+
func main() {
4+
TestSlice()
5+
TestMap()
6+
}

test/map.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"github.com/liu-cn/json-filter/filter"
6+
)
7+
8+
type Map struct {
9+
//Name string `json:"name,select(article)"`
10+
//Age int `json:"age,select(article)"`
11+
//ID int `json:"id,select(article)"`
12+
M map[string]**string `json:"m,select(test)"`
13+
T map[string]**string `json:"t,select(),omit(test)"`
14+
MP *map[string]**string `json:"mp,select(test)"`
15+
MPP **map[string]**string `json:"mpp,select(test)"`
16+
}
17+
18+
func TestMap() {
19+
20+
str := "c++从研发到脱发"
21+
ptr := &str
22+
maps := make(map[string]**string)
23+
maps["test"] = &ptr
24+
mp := &maps
25+
mpp := &mp
26+
fmt.Println("select:", filter.SelectMarshal("test", Map{M: maps, T: maps, MP: mp, MPP: mpp}).MustJSON())
27+
// {"m":{"test":"c++从研发到脱发"},"mp":{"test":"c++从研发到脱发"},"mpp":{"test":"c++从研发到脱发"}}
28+
29+
fmt.Println("omit:", filter.OmitMarshal("test", Map{M: maps, T: maps, MP: mp, MPP: mpp}).MustJSON())
30+
//{"m":{"test":"c++从研发到脱发"},"mp":{"test":"c++从研发到脱发"},"mpp":{"test":"c++从研发到脱发"}}
31+
}

test/slice.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/liu-cn/json-filter/filter"
7+
)
8+
9+
type Slice struct {
10+
Slices []**string `json:"slices,select(test)"`
11+
Test []**string `json:"test,select(),omit(test)"`
12+
SliceP *[]**string `json:"slice_p,select(test)"`
13+
SlicesPP **[]**string `json:"slices_pp,select(test)"`
14+
}
15+
16+
func TestSlice() {
17+
s := "值"
18+
p := &s
19+
20+
slice := make([]**string, 0, 5)
21+
slice = append(slice, &p)
22+
pp := &slice
23+
ppp := &pp
24+
25+
test := Slice{
26+
Slices: slice,
27+
SliceP: pp,
28+
SlicesPP: ppp,
29+
Test: slice,
30+
}
31+
32+
fmt.Println("slice select:", filter.SelectMarshal("test", test).MustJSON())
33+
//{"slice_p":["值"],"slices":["值"],"slices_pp":["值"]}
34+
fmt.Println("slice omit:", filter.OmitMarshal("test", test).MustJSON())
35+
//{"slice_p":["值"],"slices":["值"],"slices_pp":["值"]}
36+
37+
marshal, _ := json.Marshal(test)
38+
fmt.Println("原生slice json 解析", string(marshal))
39+
//{"slices":["值"],"test":["值"],"slice_p":["值"],"slices_pp":["值"]}
40+
}

0 commit comments

Comments
 (0)