@@ -8,10 +8,13 @@ import (
8
8
type TypeAdapter interface {
9
9
Type () interface {}
10
10
Unmarshal (iter * Iterator , out interface {})
11
+ Marshal (stream * Stream , val interface {})
11
12
}
12
13
13
14
type JsonAdapter struct {
14
- Unmarshal func (bytes []byte , out interface {}) error
15
+ Unmarshal func (bytes []byte , out interface {}) error
16
+ Marshal func (val interface {}) ([]byte , error )
17
+ MarshalIndent func (val interface {}, prefix , indent string ) ([]byte , error )
15
18
}
16
19
17
20
func CreateJsonAdapter (adapters ... TypeAdapter ) JsonAdapter {
@@ -23,7 +26,7 @@ func CreateJsonAdapter(adapters ...TypeAdapter) JsonAdapter {
23
26
return JsonAdapter {
24
27
Unmarshal : func (bytes []byte , out interface {}) error {
25
28
t := reflect .ValueOf (out ).Type ()
26
- adapter := adapterMap [t ]
29
+ adapter := adapterMap [t . Elem () ]
27
30
if adapter == nil {
28
31
if t .Kind () != reflect .Ptr {
29
32
return fmt .Errorf ("unmarshal expect pointer, actual type is: %s" , t )
@@ -34,5 +37,29 @@ func CreateJsonAdapter(adapters ...TypeAdapter) JsonAdapter {
34
37
adapter .Unmarshal (iter , out )
35
38
return iter .Error
36
39
},
40
+ Marshal : func (val interface {}) ([]byte , error ) {
41
+ t := reflect .ValueOf (val ).Type ()
42
+ adapter := adapterMap [t ]
43
+ if adapter == nil {
44
+ fmt .Println ("!!!" , adapterMap )
45
+ fmt .Println ("!!!" , t )
46
+ return nil , fmt .Errorf ("unknown type: %s" , t )
47
+ }
48
+ stream := NewStream ()
49
+ adapter .Marshal (stream , val )
50
+ return stream .Buffer (), stream .Error
51
+ },
52
+ MarshalIndent : func (val interface {}, prefix , indent string ) ([]byte , error ) {
53
+ t := reflect .ValueOf (val ).Type ()
54
+ adapter := adapterMap [t ]
55
+ if adapter == nil {
56
+ return nil , fmt .Errorf ("unknown type: %s" , t )
57
+ }
58
+ stream := NewStream ()
59
+ stream .Prefix = prefix
60
+ stream .Indent = indent
61
+ adapter .Marshal (stream , val )
62
+ return stream .Buffer (), stream .Error
63
+ },
37
64
}
38
65
}
0 commit comments