decoder.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. package json
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "log"
  9. "reflect"
  10. "git.ali33.ru/fcg-xvii/go-tools/containers"
  11. )
  12. type JSONTokenType byte
  13. const (
  14. JSON_INVALID JSONTokenType = iota
  15. JSON_ARRAY
  16. JSON_OBJECT
  17. JSON_VALUE
  18. )
  19. func (s JSONTokenType) String() string {
  20. switch s {
  21. case JSON_INVALID:
  22. return "JSON_INVALID"
  23. case JSON_ARRAY:
  24. return "JSON_ARRAY"
  25. case JSON_OBJECT:
  26. return "JSON_OBJECT"
  27. case JSON_VALUE:
  28. return "JSON_VALUE"
  29. default:
  30. return "JSON_UNDEFINED"
  31. }
  32. }
  33. func Decode(r io.Reader, obj interface{}) error {
  34. dec := InitJSONDecoder(r)
  35. return dec.Decode(obj)
  36. }
  37. func DecodeBytes(src []byte, obj interface{}) error {
  38. buf := bytes.NewBuffer(src)
  39. dec := InitJSONDecoder(buf)
  40. return dec.Decode(obj)
  41. }
  42. // JSON decode interfaces
  43. type Type byte
  44. const (
  45. TypeUndefined Type = iota
  46. TypeInterface
  47. TypeObject
  48. TypeSlice
  49. )
  50. type JSONInterface interface {
  51. JSONDecode(*JSONDecoder) (isNil bool, err error)
  52. }
  53. type JSONObject interface {
  54. JSONField(fieldName string, storeTemp Map) (fieldPtr interface{}, err error)
  55. }
  56. type JSONFinisher interface {
  57. JSONFinish(storeTemp Map) error
  58. }
  59. func (s *JSONDecoder) JSONTypeCheck(rv *reflect.Value) (t Type) {
  60. // check slice
  61. iface := rv.Interface()
  62. if _, check := iface.(JSONInterface); check {
  63. // check JSONInterface
  64. t = TypeInterface
  65. return
  66. } else if _, check = iface.(JSONObject); check {
  67. // check JSONObject
  68. t = TypeObject
  69. return
  70. }
  71. return
  72. }
  73. ///////////////////////////////////////////////
  74. func InitJSONDecoderFromSource(src []byte) *JSONDecoder {
  75. r := bytes.NewReader(src)
  76. return InitJSONDecoder(r)
  77. }
  78. func InitJSONDecoder(r io.Reader) *JSONDecoder {
  79. return &JSONDecoder{
  80. Decoder: json.NewDecoder(r),
  81. embedded: containers.NewStack(0),
  82. }
  83. }
  84. type JSONDecoder struct {
  85. *json.Decoder
  86. token json.Token
  87. embedded *containers.Stack
  88. current JSONTokenType
  89. objectkey bool
  90. objectClosed bool
  91. parentObj reflect.Value
  92. err error
  93. counter int
  94. }
  95. func (s *JSONDecoder) buf() {
  96. b, _ := ioutil.ReadAll(s.Buffered())
  97. log.Println(">>>", string(b))
  98. }
  99. func (s *JSONDecoder) IsObjectKey() bool { return s.objectkey }
  100. func (s *JSONDecoder) IsObjectClosed() bool { return s.objectClosed }
  101. func (s *JSONDecoder) Current() JSONTokenType { return s.current }
  102. func (s *JSONDecoder) EmbeddedLevel() int { return s.embedded.Len() }
  103. func (s *JSONDecoder) Token() (t json.Token, err error) {
  104. s.objectClosed = false
  105. if t, err = s.Decoder.Token(); err == nil {
  106. if delim, check := t.(json.Delim); check {
  107. s.objectkey = false
  108. switch delim {
  109. case '{':
  110. s.embedded.Push(JSON_OBJECT)
  111. s.current = JSON_OBJECT
  112. case '[':
  113. s.embedded.Push(JSON_ARRAY)
  114. s.current = JSON_ARRAY
  115. case '}', ']':
  116. s.embedded.Pop()
  117. s.objectClosed, s.current = true, JSON_INVALID
  118. if s.embedded.Len() > 0 {
  119. s.current = s.embedded.Peek().(JSONTokenType)
  120. }
  121. }
  122. } else {
  123. if s.current == JSON_OBJECT {
  124. s.objectkey = !s.objectkey
  125. }
  126. s.current = JSON_VALUE
  127. }
  128. }
  129. s.token = t
  130. return
  131. }
  132. func (s *JSONDecoder) Next() error {
  133. if _, err := s.Token(); err != nil {
  134. return err
  135. }
  136. switch s.current {
  137. case JSON_ARRAY, JSON_OBJECT:
  138. {
  139. stackLen := s.embedded.Len()
  140. for s.embedded.Len() >= stackLen {
  141. if _, err := s.Token(); err != nil {
  142. return err
  143. }
  144. }
  145. return nil
  146. }
  147. default:
  148. return nil
  149. }
  150. }
  151. func (s *JSONDecoder) DecodeRaw(v interface{}) error {
  152. return s.Decoder.Decode(v)
  153. }
  154. func (s *JSONDecoder) Decode(v interface{}) (err error) {
  155. rv := reflect.ValueOf(v)
  156. err = s.decodeReflect(&rv)
  157. return
  158. }
  159. func (s *JSONDecoder) decodeReflect(rv *reflect.Value) (err error) {
  160. switch s.JSONTypeCheck(rv) {
  161. case TypeInterface:
  162. {
  163. if rv.Kind() == reflect.Ptr && rv.IsNil() {
  164. rv.Set(reflect.New(rv.Type().Elem()))
  165. }
  166. var isNil bool
  167. if isNil, err = rv.Interface().(JSONInterface).JSONDecode(s); err == nil {
  168. if isNil && rv.CanAddr() {
  169. rv.Set(reflect.Zero(rv.Type()))
  170. }
  171. }
  172. return
  173. }
  174. case TypeObject:
  175. return s.decodeJSONObject(rv)
  176. case TypeSlice:
  177. return s.decodeSlice(rv)
  178. default:
  179. {
  180. if rv.Kind() == reflect.Ptr {
  181. ev := rv.Elem()
  182. if !ev.IsValid() {
  183. ev = reflect.Indirect(reflect.New(rv.Type()))
  184. ev.Set(reflect.New(ev.Type().Elem()))
  185. if err = s.decodeReflect(&ev); err == nil && !ev.IsNil() {
  186. rv.Set(ev)
  187. }
  188. return
  189. } else {
  190. if ev.Kind() == reflect.Ptr {
  191. return s.decodeReflect(&ev)
  192. } else if ev.Kind() == reflect.Slice {
  193. return s.decodeSlice(&ev)
  194. } else if ev.Kind() == reflect.Struct {
  195. return s.decodeRawObject(rv)
  196. }
  197. }
  198. }
  199. return s.Decoder.Decode(rv.Interface())
  200. }
  201. }
  202. }
  203. func fieldConvert(v reflect.Value, t reflect.Type, fieldName string) (val reflect.Value, err error) {
  204. defer func() {
  205. if r := recover(); r != nil {
  206. err = fmt.Errorf("%v :: %v", fieldName, r.(string))
  207. }
  208. }()
  209. val = v.Convert(t)
  210. return
  211. }
  212. func (s *JSONDecoder) decodeRawObject(rv *reflect.Value) (err error) {
  213. var t json.Token
  214. // chek first token is object
  215. if t, err = s.Token(); err != nil {
  216. return
  217. }
  218. if s.current != JSON_OBJECT {
  219. // check null token
  220. if t == nil {
  221. if rv.Kind() == reflect.Ptr && !rv.IsNil() {
  222. rv.Set(reflect.Zero(rv.Type()))
  223. }
  224. return
  225. }
  226. // token is not object
  227. return fmt.Errorf("EXPCTED OBJECT, NOT %T", t)
  228. }
  229. if rv.Kind() == reflect.Ptr {
  230. if rv.IsNil() {
  231. rv.Set(reflect.New(rv.Type().Elem()))
  232. }
  233. elem := rv.Elem()
  234. rv = &elem
  235. }
  236. el := s.EmbeddedLevel()
  237. for el <= s.EmbeddedLevel() {
  238. if t, err = s.Token(); err != nil {
  239. return
  240. }
  241. if s.Current() == JSON_VALUE && s.IsObjectKey() {
  242. s.buf()
  243. if f := rv.FieldByName(t.(string)); f.IsValid() {
  244. rrv := reflect.New(f.Type())
  245. if err = s.decodeReflect(&rrv); err != nil {
  246. return
  247. }
  248. if !rrv.IsNil() {
  249. f.Set(rrv.Elem())
  250. }
  251. } else {
  252. var i interface{}
  253. s.Decoder.Decode(&i)
  254. }
  255. }
  256. }
  257. return
  258. }
  259. // slice
  260. func (s *JSONDecoder) decodeSlice(rv *reflect.Value) (err error) {
  261. var t json.Token
  262. if t, err = s.Token(); err != nil {
  263. return
  264. }
  265. if s.current != JSON_ARRAY {
  266. if t == nil {
  267. if !rv.IsNil() {
  268. rv.Set(reflect.Zero(rv.Type()))
  269. }
  270. return
  271. }
  272. return fmt.Errorf("EXPCTED SLICE, NOT %T", t)
  273. }
  274. // check slice is nil
  275. if rv.IsNil() {
  276. rv.Set(reflect.MakeSlice(rv.Type(), 0, 0))
  277. }
  278. elemType := reflect.TypeOf(rv.Interface()).Elem()
  279. for s.More() {
  280. em := reflect.New(elemType)
  281. if err = s.decodeReflect(&em); err != nil {
  282. return
  283. }
  284. rv.Set(reflect.Append(*rv, em.Elem()))
  285. }
  286. if _, err = s.Token(); err != nil {
  287. return
  288. }
  289. if d, check := s.token.(json.Delim); !check || d != ']' {
  290. return fmt.Errorf("JSON PARSE ERROR :: EXPECTED ']', NOT %v", d)
  291. }
  292. return
  293. }
  294. ////////////////////////////////////////
  295. func (s *JSONDecoder) decodeJSONObject(rv *reflect.Value) (err error) {
  296. var t json.Token
  297. // chek first token is object
  298. if t, err = s.Token(); err != nil {
  299. return
  300. }
  301. if s.current != JSON_OBJECT {
  302. // check null token
  303. if t == nil {
  304. if rv.CanAddr() && !rv.IsNil() {
  305. rv.Set(reflect.Zero(rv.Type()))
  306. }
  307. return
  308. }
  309. // token is not object
  310. return fmt.Errorf("EXPCTED OBJECT, NOT %T", t)
  311. }
  312. // check null pounter in source object
  313. if rv.Kind() == reflect.Ptr && rv.IsNil() {
  314. // create new object
  315. rv.Set(reflect.New(rv.Type().Elem()))
  316. }
  317. el, obj, store := s.EmbeddedLevel(), rv.Interface().(JSONObject), NewMap()
  318. var fieldPtr interface{}
  319. for el <= s.EmbeddedLevel() {
  320. if t, err = s.Token(); err != nil {
  321. return
  322. }
  323. if s.Current() == JSON_VALUE && s.IsObjectKey() {
  324. if fieldPtr, err = obj.JSONField(t.(string), store); err != nil {
  325. return
  326. }
  327. if fieldPtr != nil {
  328. rv := reflect.ValueOf(fieldPtr)
  329. if err = s.decodeReflect(&rv); err != nil {
  330. return
  331. }
  332. } else {
  333. if err = s.Next(); err != nil {
  334. return
  335. }
  336. }
  337. }
  338. }
  339. if finisher, check := rv.Interface().(JSONFinisher); check {
  340. err = finisher.JSONFinish(store)
  341. }
  342. return
  343. }