github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/clear.go (about) 1 package jsoni 2 3 import ( 4 "context" 5 "fmt" 6 ) 7 8 type ClearJSON struct { 9 Val interface{} 10 } 11 12 func AsClearJSON(v interface{}) *ClearJSON { 13 return &ClearJSON{Val: v} 14 } 15 16 var clearJSONConfig = Config{ 17 SortMapKeys: true, 18 ClearQuotes: true, 19 }.Froze() 20 21 // Format implements fmt.Formatter 22 func (val ClearJSON) Format(state fmt.State, verb rune) { 23 d := val.Val 24 c := context.Background() 25 switch verb { 26 case 'j': 27 switch v := d.(type) { 28 case string: 29 d = clearJSON(c, []byte(v)) 30 case []byte: 31 d = clearJSON(c, v) 32 default: 33 d = clearJSONInterface(c, val.Val) 34 } 35 } 36 37 fmt.Fprint(state, d) 38 } 39 40 func clearMapStringVal(ctx context.Context, m map[string]interface{}) { 41 for k, v := range m { 42 switch t := v.(type) { 43 case string: 44 var vm map[string]interface{} 45 if err := clearJSONConfig.Unmarshal(ctx, []byte(t), &vm); err == nil { 46 clearMapStringVal(ctx, vm) 47 m[k] = vm 48 } 49 case []byte: 50 var vm map[string]interface{} 51 if err := clearJSONConfig.Unmarshal(ctx, t, &vm); err == nil { 52 clearMapStringVal(ctx, vm) 53 m[k] = vm 54 } 55 } 56 } 57 } 58 59 func clearJSON(ctx context.Context, data []byte) interface{} { 60 var m map[string]interface{} 61 if err := clearJSONConfig.Unmarshal(ctx, data, &m); err != nil { 62 return data 63 } 64 65 clearMapStringVal(ctx, m) 66 67 s, err := clearJSONConfig.MarshalToString(ctx, m) 68 if err != nil { 69 return data 70 } 71 72 return s 73 } 74 75 func clearJSONInterface(ctx context.Context, data interface{}) interface{} { 76 s, err := clearJSONConfig.MarshalToString(ctx, data) 77 if err != nil { 78 return data 79 } 80 81 return s 82 }