2016-12-14 5 views
0

У меня есть файл JSON, хранящийся на локальном компьютере. Мне нужно прочитать его в переменной и пропустить его, чтобы получить значения объекта JSON. Если я использую команду Marshal после прочтения файла с использованием метода ioutil.Readfile, он дает некоторые числа в качестве вывода. Это мои несколько неудачных попыток,Как мы можем прочитать json-файл как объект json в golang

Попытка 1:

plan, _ := ioutil.ReadFile(filename) // filename is the JSON file to read 
var data interface{} 
err := json.Unmarshal(plan, data) 
if err != nil { 
     log.Error("Cannot unmarshal the json ", err) 
     } 
fmt.Println(data) 

Он дал мне следующую ошибку,

time="2016-12-13T22:13:05-08:00" level=error msg="Cannot unmarshal the json json: Unmarshal(nil)" 
<nil> 

Попытка 2: Я пытался сохранять значения в формате JSON в структуры, а затем с помощью MarshalIndent

generatePlan, _ := json.MarshalIndent(plan, "", " ") // plan is a pointer to a struct 
fmt.Println(string(generatePlan)) 

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

Как мы можем прочитать файл JSON как объект JSON в golang? Можно ли это сделать? Любая помощь приветствуется. Заранее спасибо!

ответ

6

Значение, которое должно быть заполнено json.Unmarshal, должно быть указателем.

От GoDoc:.

распаковать разбирает данные JSON-закодирован и сохраняет результат в значении указал на которую против

Так что вам нужно сделать следующее:

plan, _ := ioutil.ReadFile(filename) 
var data interface{} 
err := json.Unmarshal(plan, &data) 

Ваша ошибка (Unmarshal (nil)) указывает, что была какая-то проблема при чтении е файл, пожалуйста, проверьте сообщение об ошибке, возвращенном ioutil.ReadFile


Также обрати внимание, что при использовании пустого интерфейса в распаковать, вам нужно будет использовать type assertion, чтобы получить базовые значения, как идут примитивные типы.

Чтобы распаковать JSON в значение интерфейса, распаковать хранит одну из этих в значении интерфейса:

bool, for JSON booleans 
float64, for JSON numbers 
string, for JSON strings 
[]interface{}, for JSON arrays 
map[string]interface{}, for JSON objects 
nil for JSON null 

Это всегда гораздо лучше подход использовать конкретную структуру, чтобы заполнить вашу JSON используя Unmarshal.

Смежные вопросы