2014-06-19 5 views
4

golang에서 일부 json을 디코딩하려고하지만 일부 필드가 디코딩되지 않습니다. 브라우저에서 실행중인 코드를 참조하십시오. here :golang json을 구조체로 디코딩하는 방법

무엇이 잘못 되었나요? MX 레코드 만 필요하므로 다른 필드를 정의하지 않았습니다. godoc에서 알 수 있듯이 사용하지 않거나 필요하지 않은 필드는 정의 할 필요가 없습니다.

// You can edit this code! 
// Click here and start typing. 
package main 

import "fmt" 
import "encoding/json" 

func main() { 

    body := ` 
    {"response": { 
    "status": "SUCCESS", 
    "data": { 
    "mxRecords": [ 
     { 
     "value": "us2.mx3.mailhostbox.com.", 
     "ttl": 1, 
     "priority": 100, 
     "hostName": "@" 
     }, 
     { 
     "value": "us2.mx1.mailhostbox.com.", 
     "ttl": 1, 
     "priority": 100, 
     "hostName": "@" 
     }, 
     { 
     "value": "us2.mx2.mailhostbox.com.", 
     "ttl": 1, 
     "priority": 100, 
     "hostName": "@" 
     } 
    ], 
    "cnameRecords": [ 
     { 
     "aliasHost": "pop.a.co.uk.", 
     "canonicalHost": "us2.pop.mailhostbox.com." 
     }, 
     { 
     "aliasHost": "webmail.a.co.uk.", 
     "canonicalHost": "us2.webmail.mailhostbox.com." 
     }, 
     { 
     "aliasHost": "smtp.a.co.uk.", 
     "canonicalHost": "us2.smtp.mailhostbox.com." 
     }, 
     { 
     "aliasHost": "imap.a.co.uk.", 
     "canonicalHost": "us2.imap.mailhostbox.com." 
     } 
    ], 
    "dkimTxtRecord": { 
     "domainname": "20a19._domainkey.a.co.uk", 
     "value": "\"v=DKIM1; g=*; k=rsa; p=DkfbhO8Oyy0E1WyUWwIDAQAB\"", 
     "ttl": 1 
    }, 
    "spfTxtRecord": { 
     "domainname": "a.co.uk", 
     "value": "\"v=spf1 redirect=_spf.mailhostbox.com\"", 
     "ttl": 1 
    }, 
    "loginUrl": "us2.cp.mailhostbox.com" 
    } 
}}` 

    type MxRecords struct { 
     value string 
     ttl  int 
     priority int 
     hostName string 
    } 



    type Data struct { 
     mxRecords []MxRecords 
    } 

    type Response struct { 
     Status string `json:"status"` 
     Data Data `json:"data"` 
    } 
    type apiR struct { 
     Response Response 
    } 

    var r apiR 
    err := json.Unmarshal([]byte(body), &r) 
    if err != nil { 
     fmt.Printf("err was %v", err) 
    } 
    fmt.Printf("decoded is %v", r) 

} 

답변

8

외부 문서 패키지 (예 : encoding/json)가 비공개 필드에 액세스 할 수없는 주된 이유는 바둑 문서가 약 json.Unmarshal 인 경우에만 내 보낸 필드에 대해서만 디코딩 할 수 있기 때문입니다.

json이 이름 규칙을 따르지 않으면 입력란에 json 태그를 사용하여 json key와 struct 필드 간의 일치를 변경할 수 있습니다.

Exemple :

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type T struct { 
    Foo string `json:"foo"` 
} 

func main() { 
    text := []byte(`{"foo":"bar"}`) 
    var t T 
    err := json.Unmarshal(text, &t) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println(t) 
} 
+0

모르겠어요. ... – user3721073

1

encoding/json 패키지는 내 보낸 구조체 필드로만 디코딩 할 수 있습니다. 사용자의 Data.mxRecords 회원은 내보내기되지 않으므로 디코딩 할 때 무시됩니다. 대문자를 사용하도록 이름을 바꾸면 JSON 패키지가이를 인식합니다.

MxRecords 유형의 모든 구성원에 대해 동일한 작업을 수행해야합니다.

4

당신은 대문자로해야한다 구조체 필드 : 나는 항상이 잊지 이유

type MxRecords struct { 
    Value string `json:"value"` 
    Ttl  int `json:"ttl"` 
    Priority int `json:"priority"` 
    HostName string `json:"hostName"` 
} 

type Data struct { 
    MxRecords []MxRecords `json:"mxRecords"` 
} 

http://play.golang.org/p/EEyiISdoaE

관련 문제