2013-11-20 3 views
3

golang 태그를 사용하여 JSON을 구문 분석하려고합니다. 내가 어떤 오류가없는,하지만 내 필드가 비어 있습니다 여기에 이동 중에 JSON을 구문 분석 할 수 없습니다.

내 코드입니다 :

type HandleConnection struct { 
    session string `json:"session"` 
    passwd int `json:"field1"` 
    salon string `json:"fied2"` 
    color string `json:"field3"` 
    state float64 `json:"field4"` 
    message string `json:"field5"` 

} 

func connection(login string, passwd string) (*HandleConnection, error) { 

    jsonParsedResponse := &HandleConnection{} 

    resp, err := http.PostForm(ajaxUrl, url.Values{ 
     "q": {"bar"}, 
     "v": {"foo"}, 
     "identifiant": {login}, 
     "motdepasse": {passwd}, 
     "mode": {"0"}, 
     "decalageHoraire": {"0"}, 
     "option": {""}, 
     "salon": {"foo"}, 
    }) 

    if err != nil { 
     return jsonParsedResponse , err 
    } 

    defer resp.Body.Close() 

    body, err := ioutil.ReadAll(resp.Body) 

    if err != nil { 
     return jsonParsedResponse, err 
    } 

    err = json.Unmarshal(body, &jsonParsedResponse) 

    if err != nil { 
     return jsonParsedResponse, err 
    } 

    if jsonParsedResponse.state != 2 { 
     return jsonParsedResponse, errors.New(jsonParsedResponse.message) 
    } 

    return jsonParsedResponse, nil 
} 

반환 된 JSON은

{ 
    "field1": "foo", 
    "fiel2": "bar", 
    ... 
} 

처럼 그리고 나는 무엇을 알고 싶습니다 이동 중에도 오류를 처리하는 더 좋은 방법입니다.

고마워요.

답변

5

구조체에 숨겨진 필드가있는 일반적인 실수를 저지르고 있습니다.

encoding/json 패키지 상태 (내 강조) :

구조체 값은 JSON 객체로 인코딩합니다. "-"또는

  • 필드가 비어 있고 그 태그는 "omitempty"옵션을 지정

    • 필드의 태그가 아닌 각 수출 구조체 필드 개체의 구성원이됩니다.
  • 이것은 이동되지 않은 필드에서 반사를 허용하지 않기 때문입니다. 다음에 구조체를 변경하는 경우
    그것은 작동합니다 :

    type HandleConnection struct { 
        Session string `json:"session"` 
        Passwd int  `json:"field1"` 
        Salon string `json:"fied2"` 
        Color string `json:"field3"` 
        State float64 `json:"field4"` 
        Message string `json:"field5"` 
    } 
    
    +0

    굉장! 소문자 이름으로 작동하지 않는 이유는 무엇입니까? – Epitouille

    +0

    @ 에피 투이 (Epitouille) 편집에 문서에 대한 언급과 그 이유를 추가했습니다. – ANisus

    -1

    당신은 그들이 공개되며 비 정렬은 해당 필드에 액세스 할 수 있도록 구조체 수도로 속성을 시작해야합니다.

    관련 문제