Guest User

Untitled

a guest
Oct 17th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.21 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "strings"
  7. )
  8.  
  9. var (
  10. stream = `
  11. {
  12. "type": "human",
  13. "name": "jordan",
  14. "city": "new york"
  15. }
  16. {
  17. "type": "dog",
  18. "name": "kiba",
  19. "breed": "husky"
  20. }
  21. `
  22.  
  23. jsonconfig = map[string]func() JSONHandler{
  24. "human": func() JSONHandler { return new(Human) },
  25. "dog": func() JSONHandler { return new(Dog) },
  26. }
  27. )
  28.  
  29. type JSONHandler interface {
  30. HandleJSON([]byte) error
  31. }
  32.  
  33. type Mask struct {
  34. TypeName string `json:"type"`
  35. }
  36.  
  37. type Human struct {
  38. Name string `json:"name"`
  39. City string `json:"city"`
  40. }
  41.  
  42. func (h *Human) HandleJSON(raw []byte) error {
  43. if err := json.Unmarshal(raw, h); err != nil {
  44. return err
  45. }
  46. fmt.Println(h)
  47. return nil
  48. }
  49.  
  50. type Dog struct {
  51. Name string `json:"name"`
  52. Breed string `json:"breed"`
  53. }
  54.  
  55. func (d *Dog) HandleJSON(raw []byte) error {
  56. if err := json.Unmarshal(raw, d); err != nil {
  57. return err
  58. }
  59. fmt.Println(d)
  60. return nil
  61. }
  62.  
  63. func main() {
  64. e := json.NewDecoder(strings.NewReader(stream))
  65. for {
  66. var raw json.RawMessage
  67. if err := e.Decode(&raw); err != nil {
  68. break
  69. }
  70. var m Mask
  71. if err := json.Unmarshal(raw, &m); err != nil {
  72. break
  73. }
  74. if err := jsonconfig[m.TypeName]().HandleJSON([]byte(raw)); err != nil {
  75. break
  76. }
  77. }
  78. }
Add Comment
Please, Sign In to add comment