json.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. )
  7. type myStruct struct {
  8. Name string
  9. Age int
  10. Status bool
  11. Values []int
  12. }
  13. func main() {
  14. // foo1()
  15. // decodeJson()
  16. // testJson()
  17. // foo2()
  18. annotation()
  19. }
  20. func foo1() {
  21. s := myStruct{
  22. Name: "John Connor",
  23. Age: 35,
  24. Status: true,
  25. Values: []int{15, 11, 37},
  26. }
  27. data, err := json.Marshal(s)
  28. if err != nil {
  29. fmt.Println(err)
  30. return
  31. }
  32. fmt.Printf("%s", data)
  33. newData, err := json.MarshalIndent(s, "", "\t")
  34. if err != nil {
  35. fmt.Println(err)
  36. return
  37. }
  38. fmt.Printf("%s", newData)
  39. }
  40. func decodeJson() {
  41. data := []byte(`{"Name":"John Connor","Age":35,"Status":true,"Values":[15,11,37]}`)
  42. var s myStruct
  43. if err := json.Unmarshal(data, &s); err != nil {
  44. fmt.Println(err)
  45. return
  46. }
  47. fmt.Printf("%v", s)
  48. }
  49. // Проверка JSON на правильность.
  50. // Можем проверить является ли срез байтов форматом json.
  51. func testJson() {
  52. type user struct {
  53. Name string
  54. Email string
  55. Status bool
  56. Language []byte
  57. }
  58. m := user{Name: "John Connor", Email: "test email"}
  59. data, _ := json.Marshal(m)
  60. data = bytes.Trim(data, "{")
  61. if !json.Valid(data) {
  62. fmt.Println("invalid json!")
  63. }
  64. fmt.Printf("%s", data)
  65. }
  66. func foo2() {
  67. type user struct {
  68. Name string
  69. Email string
  70. Status bool
  71. Language []byte
  72. }
  73. newUser := user{
  74. Name: "Alex",
  75. Email: "email@email.email",
  76. Status: true,
  77. Language: []byte("ru"),
  78. }
  79. data, err := json.Marshal(newUser)
  80. if err != nil {
  81. panic(err)
  82. }
  83. newUser.Language = []byte("en")
  84. err = json.Unmarshal(data, &newUser)
  85. if err != nil {
  86. panic(err)
  87. }
  88. fmt.Println(string(newUser.Language))
  89. // fmt.Println(data)
  90. // fmt.Printf("%s", data)
  91. }
  92. func annotation() {
  93. type myStruct struct {
  94. // при кодировании / декодировании будет использовано имя name, а не Name
  95. Name string `json:"name"`
  96. // при кодировании / декодировании будет использовано то же имя (Age),
  97. // но если значение поля равно 0 (пустое значение: false, nil, пустой слайс и пр.),
  98. // то при кодировании оно будет опущено
  99. Age int `json:",omitempty"`
  100. // при кодировании . декодировании поле всегда игнорируется
  101. Status bool `json:"-"`
  102. }
  103. m := myStruct{Name: "John Connor", Age: 0, Status: true}
  104. data, err := json.Marshal(m)
  105. if err != nil {
  106. fmt.Println(err)
  107. return
  108. }
  109. fmt.Printf("%s", data) //
  110. }