yao/pipe/json.go
2024-02-12 21:08:31 +08:00

105 lines
1.6 KiB
Go

package pipe
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
// UnmarshalJSON Custom JSON unmarshal function
func (whitelist *Whitelist) UnmarshalJSON(data []byte) error {
var list any
err := jsoniter.Unmarshal(data, &list)
if err != nil {
return err
}
switch v := list.(type) {
case []string:
list := map[string]bool{}
for _, name := range v {
list[name] = true
}
*whitelist = list
case []interface{}:
list := map[string]bool{}
for _, name := range v {
list[fmt.Sprint(name)] = true
}
*whitelist = list
case map[string]interface{}:
list := map[string]bool{}
for name := range v {
list[name] = true
}
*whitelist = list
default:
return fmt.Errorf("whitelist type error: %#v", v)
}
return nil
}
// UnmarshalJSON Custom JSON unmarshal function
func (input Input) UnmarshalJSON(data []byte) error {
var res any
err := jsoniter.Unmarshal(data, &res)
if err != nil {
return err
}
switch v := res.(type) {
case []string:
input = []any{}
for _, name := range v {
input = append(input, name)
}
case []interface{}:
input = v
case string:
input = []any{v}
default:
return fmt.Errorf("input type error: %#v", v)
}
return nil
}
// UnmarshalJSON Custom JSON unmarshal function
func (args Args) UnmarshalJSON(data []byte) error {
var res any
err := jsoniter.Unmarshal(data, &res)
if err != nil {
return err
}
switch v := res.(type) {
case []string:
args = []any{}
for _, name := range v {
args = append(args, name)
}
case []interface{}:
args = v
case string:
args = []any{v}
default:
return fmt.Errorf("input type error: %#v", v)
}
return nil
}