@@ -248,26 +248,14 @@ func unmarshalNode(data *Node, model reflect.Value, included *map[string]*Node)
248
248
249
249
structField := fieldType
250
250
251
- if structField .Type .Kind () != reflect .Struct ||
252
- fieldValue .Type () == reflect .TypeOf (new (time.Time )) ||
253
- fieldValue .Type () == reflect .TypeOf (time.Time {}) {
254
- value , err := unmarshalAttribute (attribute , args , structField , fieldValue )
255
- if err != nil {
256
- er = err
257
- break
258
- }
259
- assign (fieldValue , value )
260
- continue
261
-
262
- } else {
263
- structModel , err := unmarshalFromAttribute (attribute , fieldValue )
264
- if err != nil {
265
- er = err
266
- break
267
- }
268
- fieldValue .Set ((* structModel ).Elem ())
269
- continue
251
+ value , err := unmarshalAttribute (attribute , args , structField , fieldValue )
252
+ if err != nil {
253
+ er = err
254
+ break
270
255
}
256
+
257
+ assign (fieldValue , value )
258
+ continue
271
259
} else if annotation == annotationRelation {
272
260
isSlice := fieldValue .Type ().Kind () == reflect .Slice
273
261
@@ -346,21 +334,23 @@ func unmarshalNode(data *Node, model reflect.Value, included *map[string]*Node)
346
334
return er
347
335
}
348
336
349
- func unmarshalFromAttribute (attribute interface {}, fieldValue reflect.Value ) (* reflect.Value , error ) {
337
+ func unmarshalFromAttribute (attribute interface {}, fieldValue reflect.Value ) (reflect.Value , error ) {
350
338
structData , err := json .Marshal (attribute )
351
339
if err != nil {
352
- return nil , err
340
+ return reflect. Value {} , err
353
341
}
342
+
354
343
structNode := new (Node )
355
344
if err := json .Unmarshal (structData , & structNode .Attributes ); err != nil {
356
- return nil , err
345
+ return reflect. Value {} , err
357
346
}
347
+
358
348
structModel := reflect .New (fieldValue .Type ())
359
349
if err := unmarshalNode (structNode , structModel , nil ); err != nil {
360
- return nil , err
350
+ return reflect. Value {} , err
361
351
}
362
352
363
- return & structModel , nil
353
+ return structModel , nil
364
354
}
365
355
366
356
func fullNode (n * Node , included * map [string ]* Node ) * Node {
@@ -376,7 +366,7 @@ func fullNode(n *Node, included *map[string]*Node) *Node {
376
366
// assign will take the value specified and assign it to the field; if
377
367
// field is expecting a ptr assign will assign a ptr.
378
368
func assign (field , value reflect.Value ) {
379
- if field .Kind () == reflect .Ptr || field . Kind () == reflect . Struct {
369
+ if field .Kind () == reflect .Ptr {
380
370
field .Set (value )
381
371
} else {
382
372
field .Set (reflect .Indirect (value ))
@@ -402,12 +392,13 @@ func unmarshalAttribute(
402
392
if fieldValue .Type () == reflect .TypeOf (time.Time {}) ||
403
393
fieldValue .Type () == reflect .TypeOf (new (time.Time )) {
404
394
value , err = handleTime (attribute , args , fieldValue )
395
+
405
396
return
406
397
}
407
398
408
399
// Handle field of type struct
409
- if fieldValue .Type (). Kind () == reflect .Struct {
410
- value , err = handleStruct (attribute , fieldValue )
400
+ if fieldValue .Kind () == reflect .Struct {
401
+ value , err = unmarshalFromAttribute (attribute , fieldValue )
411
402
return
412
403
}
413
404
@@ -426,7 +417,7 @@ func unmarshalAttribute(
426
417
427
418
// Field was a Pointer type
428
419
if fieldValue .Kind () == reflect .Ptr {
429
- value , err = handlePointer (attribute , args , fieldType , fieldValue , structField )
420
+ value , err = handlePointer (attribute , fieldType , fieldValue , structField )
430
421
return
431
422
}
432
423
@@ -482,7 +473,6 @@ func handleTime(attribute interface{}, args []string, fieldValue reflect.Value)
482
473
}
483
474
484
475
var at int64
485
-
486
476
if v .Kind () == reflect .Float64 {
487
477
at = int64 (v .Interface ().(float64 ))
488
478
} else if v .Kind () == reflect .Int {
@@ -492,7 +482,6 @@ func handleTime(attribute interface{}, args []string, fieldValue reflect.Value)
492
482
}
493
483
494
484
t := time .Unix (at , 0 )
495
-
496
485
return reflect .ValueOf (t ), nil
497
486
}
498
487
@@ -558,7 +547,6 @@ func handleNumeric(
558
547
559
548
func handlePointer (
560
549
attribute interface {},
561
- args []string ,
562
550
fieldType reflect.Type ,
563
551
fieldValue reflect.Value ,
564
552
structField reflect.StructField ) (reflect.Value , error ) {
@@ -574,11 +562,13 @@ func handlePointer(
574
562
concreteVal = reflect .ValueOf (& cVal )
575
563
case map [string ]interface {}:
576
564
var err error
577
- concreteVal , err = handleStruct (attribute , fieldValue )
565
+ fieldValueType := reflect .New (fieldValue .Type ().Elem ()).Elem ()
566
+ concreteVal , err = unmarshalFromAttribute (attribute , fieldValueType )
578
567
if err != nil {
579
568
return reflect.Value {}, newErrUnsupportedPtrType (
580
569
reflect .ValueOf (attribute ), fieldType , structField )
581
570
}
571
+
582
572
return concreteVal , err
583
573
default :
584
574
return reflect.Value {}, newErrUnsupportedPtrType (
@@ -624,13 +614,13 @@ func handleStruct(
624
614
func handleStructSlice (
625
615
attribute interface {},
626
616
fieldValue reflect.Value ) (reflect.Value , error ) {
617
+
627
618
models := reflect .New (fieldValue .Type ()).Elem ()
628
619
dataMap := reflect .ValueOf (attribute ).Interface ().([]interface {})
629
620
for _ , data := range dataMap {
630
621
model := reflect .New (fieldValue .Type ().Elem ()).Elem ()
631
622
632
- value , err := handleStruct (data , model )
633
-
623
+ value , err := unmarshalFromAttribute (data , model )
634
624
if err != nil {
635
625
continue
636
626
}
0 commit comments