Advertisement
ozz-life

Golang JSON читается плохо

Feb 11th, 2024 (edited)
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 6.59 KB | None | 0 0
  1. // Проблема. Некорректно разбирается JSON. На выходе получается
  2.  
  3. // Тест:
  4. // JSON-строка: {
  5. // Ошибка разбора JSON: unexpected end of JSON input
  6. // JSON-строка: "dir": "root",
  7. // Ошибка разбора JSON: invalid character ':' after top-level value
  8. // JSON-строка: "files": [".zshrc"],
  9. // Ошибка разбора JSON: invalid character ':' after top-level value
  10. // JSON-строка: "folders": [
  11. // Ошибка разбора JSON: invalid character ':' after top-level value
  12. // JSON-строка: {
  13. // Ошибка разбора JSON: unexpected end of JSON input
  14. // JSON-строка: "dir": "desktop",
  15. // Ошибка разбора JSON: invalid character ':' after top-level value
  16. // JSON-строка: "files": ["config.yaml"]
  17. // Ошибка разбора JSON: invalid character ':' after top-level value
  18. // JSON-строка: },
  19. // Ошибка разбора JSON: invalid character '}' looking for beginning of value
  20. // JSON-строка: {
  21. // Ошибка разбора JSON: unexpected end of JSON input
  22. // JSON-строка: "dir": "downloads",
  23. // Ошибка разбора JSON: invalid character ':' after top-level value
  24. // JSON-строка: "files": ["cat.png.hack"],
  25. // Ошибка разбора JSON: invalid character ':' after top-level value
  26. // JSON-строка: "folders": [
  27. // Ошибка разбора JSON: invalid character ':' after top-level value
  28. // JSON-строка: {
  29. // Ошибка разбора JSON: unexpected end of JSON input
  30. // JSON-строка: "dir": "kta",
  31. // Ошибка разбора JSON: invalid character ':' after top-level value
  32. // JSON-строка: "files": [
  33. // Ошибка разбора JSON: invalid character ':' after top-level value
  34. // JSON-строка: "kta.exe",
  35. // Ошибка разбора JSON: invalid character ',' after top-level value
  36. // JSON-строка: "kta.hack"
  37. // Ошибка разбора JSON: json: cannot unmarshal string into Go value of type main.Directory
  38. // JSON-строка: ]
  39. // Ошибка разбора JSON: invalid character ']' looking for beginning of value
  40. // JSON-строка: }
  41. // Ошибка разбора JSON: invalid character '}' looking for beginning of value
  42. // JSON-строка: ]
  43. // Ошибка разбора JSON: invalid character ']' looking for beginning of value
  44. // JSON-строка: }
  45. // Ошибка разбора JSON: invalid character '}' looking for beginning of value
  46. // JSON-строка: ]
  47. // Ошибка разбора JSON: invalid character ']' looking for beginning of value
  48. // JSON-строка: }
  49. // Ошибка разбора JSON: invalid character '}' looking for beginning of value
  50. // Всего зараженных файлов: 0
  51. // Тест:
  52. // JSON-строка: { "dir"
  53. // Ошибка разбора JSON: unexpected end of JSON input
  54. // JSON-строка: :
  55. // Ошибка разбора JSON: invalid character ':' looking for beginning of value
  56. // JSON-строка: "awesomeproject"
  57. // Ошибка разбора JSON: json: cannot unmarshal string into Go value of type main.Directory
  58. // JSON-строка: ,
  59. // Ошибка разбора JSON: invalid character ',' looking for beginning of value
  60. // JSON-строка: "files" : [ "go.mod",
  61. // Ошибка разбора JSON: invalid character ':' after top-level value
  62. // JSON-строка: "go.sum"
  63. // Ошибка разбора JSON: json: cannot unmarshal string into Go value of type main.Directory
  64. // JSON-строка: ],
  65. // Ошибка разбора JSON: invalid character ']' looking for beginning of value
  66. // Ошибка чтения строки: EOF
  67. // Всего зараженных файлов: 0
  68.  
  69. // Не имею ни малейшего представления как его считать грамотно, возможно
  70. // проблема где-то при чтении из буфера
  71.  
  72.  
  73. ////////////////////////////////////////////////////////////////////////////////
  74. // Входные данные:
  75.  
  76. 2
  77. 23
  78. {
  79. "dir": "root",
  80. "files": [".zshrc"],
  81. "folders": [
  82. {
  83. "dir": "desktop",
  84. "files": ["config.yaml"]
  85. },
  86. {
  87. "dir": "downloads",
  88. "files": ["cat.png.hack"],
  89. "folders": [
  90. {
  91. "dir": "kta",
  92. "files": [
  93. "kta.exe",
  94. "kta.hack"
  95. ]
  96. }
  97. ]
  98. }
  99. ]
  100. }
  101. 8
  102. { "dir"
  103. :
  104. "awesomeproject"
  105. ,
  106. "files" : [ "go.mod",
  107. "go.sum"
  108. ],
  109. "folders":[{"dir":"cmd"}]}
  110.  
  111. ////////////////////////////////////////////////////////////////////////////////
  112.  
  113. package main
  114.  
  115. import (
  116.     "bufio"
  117.     "encoding/json"
  118.     "fmt"
  119.     "os"
  120.     "strings"
  121. )
  122.  
  123. type Directory struct {
  124.     Dir     string      `json:"dir"`
  125.     Files   []string    `json:"files"`
  126.     Folders []Directory `json:"folders"`
  127. }
  128.  
  129. func countInfectedFiles(dir Directory) int {
  130.     count := 0
  131.  
  132.     for _, file := range dir.Files {
  133.         if strings.HasSuffix(file, ".hack") {
  134.             count++
  135.         }
  136.     }
  137.  
  138.     for _, folder := range dir.Folders {
  139.         count += countInfectedFiles(folder)
  140.     }
  141.  
  142.     return count
  143. }
  144.  
  145. func solve(in *bufio.Reader, out *bufio.Writer) {
  146.     var n int
  147.     fmt.Fscan(in, &n)
  148.     fmt.Println("Тест:")
  149.     in.ReadString('\n')
  150.  
  151.     totalInfectedFiles := 0
  152.     for j := 0; j < n; j++ {
  153.         jsonStr, err := in.ReadString('\n')
  154.         if err != nil {
  155.             fmt.Println("Ошибка чтения строки:", err)
  156.             continue
  157.         }
  158.  
  159.         jsonStr = strings.TrimSpace(jsonStr)
  160.  
  161.         if jsonStr == "" {
  162.             fmt.Println("Ошибка: пустая строка с данными JSON")
  163.             continue
  164.         }
  165.  
  166.         fmt.Println("JSON-строка:", jsonStr)
  167.  
  168.         var dir Directory
  169.         err = json.Unmarshal([]byte(jsonStr), &dir)
  170.         if err != nil {
  171.             fmt.Println("Ошибка разбора JSON:", err)
  172.             continue
  173.         }
  174.  
  175.         var filesCount int
  176.         _, err = fmt.Fscan(in, &filesCount)
  177.         if err != nil {
  178.             fmt.Println("Ошибка чтения количества файлов:", err)
  179.             continue
  180.         }
  181.  
  182.         for k := 0; k < filesCount; k++ {
  183.             var fileName string
  184.             _, err = fmt.Fscan(in, &fileName)
  185.             if err != nil {
  186.                 fmt.Println("Ошибка чтения имени файла:", err)
  187.                 continue
  188.             }
  189.  
  190.             dir.Files = append(dir.Files, fileName)
  191.         }
  192.  
  193.         infectedFiles := countInfectedFiles(dir)
  194.         totalInfectedFiles += infectedFiles
  195.  
  196.         fmt.Printf("Для теста %d количество зараженных файлов: %d\n", j+1, infectedFiles)
  197.     }
  198.  
  199.     fmt.Printf("Всего зараженных файлов: %d\n", totalInfectedFiles)
  200. }
  201.  
  202. func main() {
  203.     in := bufio.NewReader(os.Stdin)
  204.     out := bufio.NewWriter(os.Stdout)
  205.     defer out.Flush()
  206.  
  207.     var countTest int
  208.     fmt.Fscan(in, &countTest)
  209.  
  210.     for i := 0; i < countTest; i++ {
  211.         solve(in, out)
  212.     }
  213. }
  214.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement