| 218 | } |
| 219 | |
| 220 | func parseValue(ov *Value, v reflect.Value) { |
| 221 | if ov == nil || !v.IsValid() { |
| 222 | return |
| 223 | } |
| 224 | vt := v.Type() |
| 225 | switch v.Kind() { |
| 226 | case reflect.Ptr: |
| 227 | if ov.IsNil() { |
| 228 | return |
| 229 | } |
| 230 | if v.IsNil() { |
| 231 | value := reflect.New(vt.Elem()) |
| 232 | v.Set(value) |
| 233 | } |
| 234 | parseValue(ov, v.Elem()) |
| 235 | case reflect.Map: |
| 236 | keys := ov.Keys() |
| 237 | if keys == nil { |
| 238 | v.Set(reflect.Zero(vt)) |
| 239 | return |
| 240 | } |
| 241 | valueType := vt.Elem() |
| 242 | r := reflect.MakeMapWithSize(v.Type(), len(keys)) |
| 243 | for _, key := range keys { |
| 244 | value := reflect.New(valueType) |
| 245 | parseValue(ov.Get(key), value.Elem()) |
| 246 | r.SetMapIndex(reflect.ValueOf(key), value.Elem()) |
| 247 | } |
| 248 | v.Set(r) |
| 249 | case reflect.Slice: |
| 250 | arr := ov.Array() |
| 251 | if arr == nil { |
| 252 | v.Set(reflect.Zero(vt)) |
| 253 | return |
| 254 | } |
| 255 | n := len(arr) |
| 256 | r := reflect.MakeSlice(vt, 0, n) |
| 257 | |
| 258 | for i := 0; i < n; i++ { |
| 259 | value := reflect.New(vt.Elem()) |
| 260 | parseValue(arr[i], value.Elem()) |
| 261 | r = reflect.Append(r, value.Elem()) |
| 262 | } |
| 263 | v.Set(r) |
| 264 | case reflect.Array: |
| 265 | arr := ov.Array() |
| 266 | if arr == nil { |
| 267 | v.Set(reflect.Zero(vt)) |
| 268 | return |
| 269 | } |
| 270 | n := len(arr) |
| 271 | var arrLen = vt.Len() |
| 272 | r := reflect.New(reflect.ArrayOf(arrLen, vt.Elem())) |
| 273 | for i := 0; i < n && i < arrLen; i++ { |
| 274 | value := reflect.New(vt.Elem()) |
| 275 | parseValue(arr[i], value.Elem()) |
| 276 | r.Elem().Index(i).Set(value.Elem()) |
| 277 | } |