Разбор JSON правильно в Go - PullRequest
       54

Разбор JSON правильно в Go

0 голосов
/ 11 декабря 2019

За последние 2 дня я как-то застрял с JSON и Go. Моя цель очень проста - одна программа Go, которая может прочитать файл JSON, правильно вывести его и добавить некоторые элементы в этот JSON, а затем перезаписать его обратно на диск.

Сохраненный файл JSON.

{
"Category": ["food","music"],
"Time(min)": "351",
"Channel": {
    "d2d": 10,
    "mkbhd": 8,
    "coding Train": 24
},
"Info": {
    "Date":{
        "date":["vid_id1","vid_id2","vid_id3"],
        "02/11/2019":["id1","id2","id3"],
        "03/11/2019":["SonwZ6MF5BE","8mP5xOg7ijs","sc2ysHjSaXU"]
        },
    "Videos":{
        "videos": ["Title","Category","Channel","length"],
        "sc2ysHjSaXU":["Bob Marley - as melhores - so saudade","Music","So Saudade","82"],
        "SonwZ6MF5BE":["Golang REST API With Mux","Science & Technology","Traversy Media","44"],
        "8mP5xOg7ijs":["Top 15 Funniest Friends Moments","Entertainment","DjLj11","61"]
    }
  }
}

Я успешно проанализировал JSON в Go, но затем, когда я пытаюсь получить JSON ["Info"] ["Date"], он выдает ошибку интерфейса. Я не могу создать конкретную структуру, потому что все элементы будут динамически изменяться при каждом вызове кода / API.

Код, который я использую для анализа данных

// Open our jsonFile
jsonFile, err := os.Open("yt.json")
if err != nil {fmt.Println(err)}
fmt.Println("Successfully Opened yt.json")
defer jsonFile.Close()
byteValue, _ := ioutil.ReadAll(jsonFile)
var result map[string]interface{}
json.Unmarshal([]byte(byteValue), &result)


json_data := result["Category"] //returns correct ans
json_data := result["Info"]["Date"] // returns error - type interface {} does not support indexing

ЛюбойПомощь / руководство высоко ценится. Большое спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2019

К сожалению, вы должны утверждать типы каждый раз, когда получаете доступ к проанализированным данным:

date := result["Info"].(map[string]interface{})["Date"]

Теперь date равно map[string]interface{}, но его статически известный тип по-прежнему interface{}.

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

1 голос
/ 11 декабря 2019

вы не можете получить доступ к внутренним свойствам с result[][]. Вам нужно сделать что-то вроде следующего,

info:= result["Info"]
v := info.(map[string]interface{})
json_data = v["Date"]
...