util/encoding/json/json.go

51 lines
1.5 KiB
Go
Raw Permalink Normal View History

2017-12-04 08:59:56 +00:00
package json
2018-03-20 05:12:31 +00:00
import (
"encoding/json"
"fmt"
"reflect"
2018-03-20 05:18:16 +00:00
cur "git.loafle.net/commons_go/util/reflect"
2018-03-20 05:12:31 +00:00
)
// SetValueWithJSONStringArray set the value of json string array
// raw([]byte) is ["1", {"a": 1}, [1, 2]]
// targets([]interface{}) is array of pointer ex) *int, *string, *[], *map, *struct
func SetValueWithJSONStringArray(raw []byte, targets []interface{}) error {
var values []string
if err := json.Unmarshal(raw, &values); err != nil {
return err
}
if len(targets) != len(values) {
return fmt.Errorf("Count of raw[%d] and targets[%d] is not same", len(values), len(targets))
}
for indexI := 0; indexI < len(values); indexI++ {
target := targets[indexI]
value := values[indexI]
if reflect.Ptr != reflect.TypeOf(target).Kind() {
return fmt.Errorf("Type of target[%d] must be ptr but is %s, value=%s", indexI, reflect.TypeOf(target).Kind(), value)
}
switch reflect.TypeOf(target).Elem().Kind() {
case reflect.Array, reflect.Slice, reflect.Map, reflect.Struct:
if err := json.Unmarshal([]byte(value), &target); nil != err {
return err
}
case reflect.Ptr:
return fmt.Errorf("Type of target[%d] cannot be double ptr, value=%s", indexI, value)
default:
2018-03-20 05:18:16 +00:00
cv, err := cur.ConvertToType(value, reflect.TypeOf(target).Elem())
if nil != err {
return fmt.Errorf("Type conversion of value[%s] has been failed to %s[%d]", value, reflect.TypeOf(target).Elem().Kind(), indexI)
}
2018-03-20 05:12:31 +00:00
2018-03-20 05:41:27 +00:00
reflect.ValueOf(target).Elem().Set(reflect.ValueOf(cv))
2018-03-20 05:18:16 +00:00
}
2018-03-20 05:12:31 +00:00
}
return nil
}