| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // Copyright 2019 Yunion
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package jsonutils
- import (
- "reflect"
- "yunion.io/x/pkg/errors"
- "yunion.io/x/pkg/gotypes"
- )
- var (
- JSONDictType reflect.Type
- JSONArrayType reflect.Type
- JSONStringType reflect.Type
- JSONIntType reflect.Type
- JSONFloatType reflect.Type
- JSONBoolType reflect.Type
- JSONDictPtrType reflect.Type
- JSONArrayPtrType reflect.Type
- JSONStringPtrType reflect.Type
- JSONIntPtrType reflect.Type
- JSONFloatPtrType reflect.Type
- JSONBoolPtrType reflect.Type
- JSONObjectType reflect.Type
- )
- func init() {
- JSONDictType = reflect.TypeOf(JSONDict{})
- JSONArrayType = reflect.TypeOf(JSONArray{})
- JSONStringType = reflect.TypeOf(JSONString{})
- JSONIntType = reflect.TypeOf(JSONInt{})
- JSONFloatType = reflect.TypeOf(JSONFloat{})
- JSONBoolType = reflect.TypeOf(JSONBool{})
- JSONDictPtrType = reflect.TypeOf(&JSONDict{})
- JSONArrayPtrType = reflect.TypeOf(&JSONArray{})
- JSONStringPtrType = reflect.TypeOf(&JSONString{})
- JSONIntPtrType = reflect.TypeOf(&JSONInt{})
- JSONFloatPtrType = reflect.TypeOf(&JSONFloat{})
- JSONBoolPtrType = reflect.TypeOf(&JSONBool{})
- JSONObjectType = reflect.TypeOf((*JSONObject)(nil)).Elem()
- gotypes.RegisterSerializable(JSONObjectType, func() gotypes.ISerializable {
- return nil
- })
- gotypes.RegisterSerializable(JSONDictPtrType, func() gotypes.ISerializable {
- return NewDict()
- })
- gotypes.RegisterSerializable(JSONArrayPtrType, func() gotypes.ISerializable {
- return NewArray()
- })
- }
- func JSONDeserialize(objType reflect.Type, strVal string) (gotypes.ISerializable, error) {
- objPtr, err := gotypes.NewSerializable(objType)
- if err != nil {
- return nil, errors.Wrap(err, "gotypes.NewSerializable")
- }
- json, err := ParseString(strVal)
- if err != nil {
- return nil, errors.Wrap(err, "ParseString")
- }
- if objPtr == nil {
- return json, nil
- }
- err = json.Unmarshal(objPtr)
- if err != nil {
- return nil, errors.Wrap(err, "json.Unmarshal")
- }
- objPtr = gotypes.Transform(objType, objPtr)
- return objPtr, nil
- }
|