2016-12-14 4 views
0

로컬 컴퓨터에 JSON 파일이 저장되어 있습니다. JSON 객체 값을 가져 오기 위해 변수에서 읽고 그것을 반복해야합니다. ioutil.Readfile 메서드를 사용하여 파일을 읽은 후 마샬링 명령을 사용하면 일부 숫자가 출력됩니다. 그것은 나에게 다음과 같은 오류를 준golang에서 json 파일로 json 파일을 읽을 수있는 방법

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 객체로 루프를 만들 수 없습니다.

golang에서 JSON 파일을 JSON 객체로 읽을 수있는 방법은 무엇입니까? 그렇게 할 수 있습니까? 도움을 주시면 감사하겠습니다. 미리 감사드립니다!

답변

6

json.Unmarshal으로 채울 값은 포인터 여야합니다. GoDoc에서

:.

비 정렬 화는 JSON 인코딩 된 데이터를 분석하고 값 의 결과가 V에 의해을 지적 저장

그래서 당신이 다음을 수행해야합니다

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

오류 (Unmarshal (nil))는 읽기에 문제가 있음을 나타냅니다. 전자 파일은 또한 비 정렬 화에 빈 인터페이스를 사용하는 경우, 당신은 기본 형식을 이동 등의 기본 값을 얻을 수 type assertion를 사용할 필요가 있음을 유의하시기 바랍니다 ioutil.ReadFile


에 의해 반환 된 오류를 확인하십시오. 인터페이스 값에 정렬 화 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을 사용하십시오.