Как читать карту "интерфейсы" JSON без определения структуры в Голанге? - PullRequest
0 голосов
/ 09 декабря 2018

После этого урока Я пытаюсь прочитать файл JSON на Голанге.Он говорит, что есть два способа сделать это:

  1. разархивировать JSON, используя набор предопределенных структур
  2. , или разархивировать JSON, используя интерфейс map [string] {}

Поскольку у меня, вероятно, будет много разных форматов json, я предпочитаю интерпретировать их на лету.Итак, теперь у меня есть следующий код:

package main

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

func main() {
    // Open our jsonFile
    jsonFile, err := os.Open("users.json")
    // if we os.Open returns an error then handle it
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("Successfully Opened users.json")
    // defer the closing of our jsonFile so that we can parse it later on
    defer jsonFile.Close()

    byteValue, _ := ioutil.ReadAll(jsonFile)

    var result map[string]interface{}
    json.Unmarshal([]byte(byteValue), &result)

    fmt.Println(result["users"])
    fmt.Printf("%T\n", result["users"])
}

Это распечатывает:

Successfully Opened users.json
[map[type:Reader age:23 social:map[facebook:https://facebook.com twitter:https://twitter.com] name:Elliot] map[name:Fraser type:Author age:17 social:map[facebook:https://facebook.com twitter:https://twitter.com]]]
[]interface {}

На данный момент я не понимаю, как я могу прочитать возраст первого пользователя (23).Я попробовал несколько вариантов:

fmt.Println(result["users"][0])
fmt.Println(result["users"][0].age)

Но, по-видимому, type interface {} does not support indexing.

Есть ли способ, которым я могу получить доступ к элементам в json, не определяя структуру?

1 Ответ

0 голосов
/ 09 декабря 2018

Возможно, вы хотите

fmt.Println(result["users"].(map[string]interface{})["age"])

или

fmt.Println(result[0].(map[string]interface{})["age"])

Поскольку JSON представляет собой карту карт, тип конечных узлов - это интерфейс {}, поэтому его необходимо преобразовать вmap [string] interface {} для поиска ключа

Определение структуры намного проще.Мой главный совет для этого - использовать веб-сайт, который преобразует JSON в определение структуры Go, например Json-To-Go

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