2017-12-20 9 views
-3

내가 보이는 JSON 파일을 읽으려고하고 같은JSON 및 유형 캐스팅

[{ "title": "hi", "tags": [1,2,3,4,5,6] }, {...}, {...}] 

및 코드는 내가 무엇을 알아 내려고 노력하고 있어요 것은 내가 피할 수있는 방법이다이

contentdat, err := ioutil.ReadFile("content.json") 
check(err) 
var content []interface{} 
err = json.Unmarshal(contentdat, &content) 
check(err) 


for i, contentItem := range content { 
    vertedContentItem := contentItem.(map[string]interface{}) 
    contentTags := vertedContentItem["tags"].([]interface{}) 
    contentItemTags := make([]int, len(contentTags)) 
    for i, ctv := range contentTags { 
     contentItemTags[i] = int(ctv.(float64)) 
    } 

처럼 보인다 모든 유형 캐스팅을 수행하고 json obj에 직접 액세스하거나 전체 json 구조에 대해 한 번만 입력하면됩니다. 나는 예상대로 구조하지만하셨습니까 '를 통해 대신 인터페이스 {} 그냥 루프의

var content []Content 

같은 내용을 너무

type Content struct { 
    title string 
    tags []int 
} 

같은 내부 객체의 구조를 정의하고 선언에 대해 생각을했다 일하지 마라. 어떤 아이디어?

+1

샘플 JSON이 유효하지 않습니다. – Adrian

+0

업데이트 됨, 감사합니다. –

+3

중복. 3'000th입니다. – Volker

답변

2

당신은 당신이 대문자를 사용하여 직렬화/해제하고자하는 "콘텐츠"구조체의 필드를 내 보내야합니다 : 예를 들어

type Content struct { 
    Title string 
    Tags []int 
} 

:

type Content struct { 
    Title string 
    Tags []int 
} 

func main() { 
    jsonstr := `[{"title":"hi","tags":[1,2,3,4,5,6]}]` 
    contents := []Content{} 

    err := json.Unmarshal([]byte(jsonstr), &contents) 
    if err != nil { 
    panic(err) 
    } 

    fmt.Printf("%#v\n", contents) 
    // => []main.Content{main.Content{Title:"hi", Tags:[]int{1, 2, 3, 4, 5, 6}}} 

} 
+0

감사합니다. 필드를 내보내는 이유는 무엇입니까? –

+0

@MikeF 이름이 소문자로 시작하는 필드가 "private"(명명 된 패키지 외부에서는 사용할 수 없음)이고 이름이 대문자로 시작하는 필드가 "내 보낸" 명명 된 패키지). [JSON un/marshaler] (https://golang.org/pkg/encoding/json/#Unmarshal)는 _exported_ 필드 만 고려하도록 설계되었습니다. [JSON and Go] (https://blog.golang.org/json-and-go)에 대한이 기사도 참조하십시오. – maerics