Вопрос о разборе вложенного JSON через Struct

#json #go

#json #Вперед

Вопрос:

У меня есть интересный файл JSON, который немного вложен, и я не смог найти хороший пример того, как его правильно разобрать. Может кто-нибудь, пожалуйста, взглянуть ниже, чтобы увидеть, верны ли мои структуры, я могу анализировать элементы корневого уровня, но чем глубже я пытаюсь зайти, тем больше я теряюсь. Пожалуйста, посмотрите мой код ниже:

Файл JSON, который я пытаюсь проанализировать, находится в отдельном файле:

 {
  "pushed": 090909099,
  "job_id": 17422,
  "processed": 159898989,
  "unit_report": [
    {
      "meta": {
        "file": {
          "file_type": "Binary",
          "file_name": "Bob.txt",
          "file_path": "/usr/local/Bob.txt",
          "size": 4563,
          "entropy": 3.877,
          "hashes": [
            {
              "name": "Uniq34",
              "value": "02904234234234234243"
            },
            {
              "name": "sha1",
              "value": "23423423423423423423423"
            },
            {
              "name": "sha256",
              "value": "523412423424234234234"
            }
          ]
        },
  

И моя настройка структуры приведена ниже в моем файле Go ниже:

 package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
)

// Report struct
type Report struct {
    Pushed int `json:"pushed"`
    JobID    int `json:"job_id"`
    Processed int `json:"processed"`
    SetReport  []struct {
        Meta struct {
            File struct {
                FileType    string `json:"file_type"`
                FileName    string `json:"file_name"`
                FilePath    string `json:"file_path"`
                Size        int    `json:"size"`
                Entropy     int    `json:"entropy"`
            }
        }
    }
}
  

Комментарии:

1. Избавление от анонимных структур облегчит рассуждения об этом. Вам не хватает тегов json для полей типа struct.

2. Просто используйте mholt.github.io/json-to-go

Ответ №1:

Проблема с вашим кодом заключается в том, что вы хотите, чтобы unit_report в ваших json данных сопоставлялись с SetReport в Go struct.

Для этого вы либо устанавливаете json:"unit_report в свое SetReport поле, либо переименовываете SetReport в UnitReport .

Либо:

 Processed int `json:"processed"`
SetReport  []struct {

...

} `json:"unit_report`  // See the changes here
  

или:

 Processed int `json:"processed"`
UnitReport  []struct { // See the changes here
    ...
}