Разбор вложенного файла JSON - PullRequest
0 голосов
/ 03 марта 2019

Я анализирую файл JSON с необычной структурой, которая выглядит следующим образом:

{
    "394885": 
    {
        "record": 
        {
            "student_name": "Daryl Jones",
            "student_number": 123884,
            "student_dob": "12/10/1982",
            "student_email": "djones@school.ac.uk",
        }    
    },
}

Я работал над некоторыми демонстрационными примерами кода, но я хотел бы поместить все это в структуру, который я затем планирую найти по числовой строке, по которой можно угадать имя объекта?

Я не силен в JSON или Go, и этот код я уже написал:

package main

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

type id struct {
    recordid string
    record   []record
}

type record struct {
    name   string
    number uint32
    dob    string
    email  string
}

func main() {
    jsonFile, err := os.Open("/home/emyrw/development/go/src/json_processor/demo.json")
    if err != nil {
        fmt.Println(err)
    } else {
        var records id

        byteValue, _ := ioutil.ReadAll(jsonFile)
        json.Unmarshal(byteValue, &records)
        fmt.Println(records)

        fmt.Println("opened demo.json")
        defer jsonFile.Close()
    }
}

Я не уверен, что понял правильно, но был бы признателен за любые советы или рекомендации, которые кто-либо может предложить.Я гуглил, но ни один из образцов, которые я нахожу, не подходит под мой сценарий.

Ответы [ 4 ]

0 голосов
/ 05 марта 2019

пакет jsonquery может легко извлекать данные из документа JSON, и он не зависит от определенного объекта структуры.

func main() {
    s := `{
        "394885": 
        {
            "record": 
            {
                "student_name": "Daryl Jones",
                "student_number": 123884,
                "student_dob": "12/10/1982",
                "student_email": "djones@school.ac.uk"
            }    
        }
    }`
    doc, err := jsonquery.Parse(strings.NewReader(s))
    if err != nil {
        panic(err)
    }
    nodes := jsonquery.Find(doc, "*")
    for _, n := range nodes {
        fmt.Printf("id: %s \n", n.Data)
        name := jsonquery.FindOne(n, "//student_name") // Find student name node
        fmt.Printf("student name: %s\n", name.InnerText())
        number := jsonquery.FindOne(n, "//student_number") // Find node for student number
        fmt.Printf("student number: %s\n", number.InnerText())
    }
}

0 голосов
/ 03 марта 2019

Во-первых, ваш JSON недействителен.В отличие от структур GoLang, вам не нужно ставить , после конечного объекта.

{"394885": {"record": {"student_name": "Daryl Jones", "student_number": 123884, "student_dob": "10.12.1982", "student_email": "djones@school.ac.uk"}
}}

Во-вторых, var records должен точно моделировать ваш JSON,либо с помощью имен полей в вашей структуре в точности так, как они названы в объекте JSON, либо с помощью атрибутов.

Внешний вид вашего JSON не имеет тип id, он имеет тип map[string]id

id не имеет поля recordid, однако имеет поле record, но поле ваших структур должно быть экспортировано (начните с заглавной буквы), если вы хотите сериализоватьJSON в них.

Здесь атрибуты пригодятся,

type id struct {
    Record []record `json:"record"`
}

То же самое со структурой record,

type record struct {
    Name string `json:"student_name"`
    Email string `json:"student_email"`
    // You get the idea...
}

В-третьих, вы ставите *Оператор 1026 * сразу после того, как вы открываете файл, помещая его в конец блока, лишается цели.

0 голосов
/ 03 марта 2019

Объявление типов Go, соответствующих структуре данных.Данные JSON имеют три уровня объектов.Используйте карту для представления объекта верхнего уровня в JSON, поскольку объект верхнего уровня имеет произвольные ключи.Используйте структуры для объектов более низкого уровня в JSON.

Используйте теги полей JSON для сопоставления имен случаев змеи, используемых в JSON, с более идиоматическими именами Go. Экспорт полей для доступа к ним из пакета JSON.

См. Документацию по функции Marshal для получения информации о том, как пакет json / encoding использует теги полей итребование экспортировать поля.

type Record struct {
    Name   string `json:"student_name"`
    Number uint32 `json:"student_number"`
    DOB    string `json:"student_dob"`
    Email  string `json:"student_email"`
}

type ID struct {
    Record Record
}

...

var records map[string]ID
err := json.Unmarshal(jsonFile, &records)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%#v\n", records)

Запустить его на детской площадке .

0 голосов
/ 03 марта 2019

Вы можете использовать эту структуру для своего типа идентификатора

type id struct {
    record map[string]record
}

Редактировать

вот рабочее решение с некоторым объяснением:

, так каку вас есть многоуровневый json, вы можете разобрать его во вложенные структуры.

{
        "student_name": "Daryl Jones",
        "student_number": 123884,
        "student_dob": "12/10/1982",
        "student_email": "djones@school.ac.uk"
} 

для разбора этой части json вам нужна эта структура

type record struct {
    Name   string `json:"student_name"`
    Number uint32 `json:"student_number"`
    Dob    string `json:"student_dob"`
    Email  string `json:"student_email"`
}

поля должны быть экспортированы(начинаются с заглавной буквы) и имеют тег json, соответствующий свойствам json.

{
    "record": 
    {
        "student_name": "Daryl Jones",
        "student_number": 123884,
        "student_dob": "12/10/1982",
        "student_email": "djones@school.ac.uk"
    }    
}

, чтобы эта часть работала, вам нужна вложенная структура, такая как

type id struct {
     Record record
}

имя поляснова экспортируется, но так как он соответствует вашему свойству json, вам не нужен тег.

{
"394885": 
  {
    "record": 
    {
        "student_name": "Daryl Jones",
        "student_number": 123884,
        "student_dob": "12/10/1982",
        "student_email": "djones@school.ac.uk"
    }    
  }
}

, поскольку имя свойства верхнего уровня - это идентификатор студента, вы можете использовать карту вместо структуры

 var records map[string]id 

и убедиться, что у вас нет запятыхне допускается в спецификации JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...