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  }