2017-04-01 1 views
1

나는 타사 json API를 사용하여 이동 중에 작업 할 수 있습니다.
데이터를 키 - 값으로 반환하는 일부 끝점이 있습니다. 예를 들어
현재 상태에 대한 JSON입니다 : 그래서사용자 지정 Json 마샬링

{ 
    "result": { 
    "0": "done", 
    "1": "incomplete", 
    "2": "completed", 
    .... 
    } 
} 

당신이이 객체 인 배열이 아닌 참조한다.
는 그 값을 추출

type StatusReposne struct { 
    Result map[string]string `json:"result"` 
} 

코드 같은 추가적인 구조체를 사용하지 않고

type Status struct { 
    Id int 
    Status string 
} 

형상물 배열 JSON 이런 종류의 마샬링 할 수 있는가?

+0

를 지금까지 내가 그 일반'인코딩/json.Unmarshal'으로 불가능하고 일부 추가 작업을 수행하지 않고 알고 :이 코드는 Status s의 조각에서 원수 /에에/비 정렬 화 된 데이터를 수단을 제공한다. ..지도에 먼저 비 정렬화한 다음 그지도를 반복하면'Status' 구조체의 조각을 만들거나'type Result [] Status'와 같은 형식을 만들고 해당 형식에 대한 unmarshaler 인터페이스를 구현할 수 있습니다. – mkopriva

답변

2

@mkopriva가 의견에 언급했듯이, 약간의 추가 작업으로는 불가능합니다.

func main() { 
    sr := new(StatusReposne) 

    json.Unmarshal([]byte(input), sr) 
    fmt.Printf("%+v\n", sr) 

    js, _ := json.Marshal(sr) 
    fmt.Printf("%s\n", js) 
} 

type StatusReposne struct { 
    Result []Status `json:"result"` 
} 

type Status struct { 
    Id  int 
    Status string 
} 

func (x *StatusReposne) MarshalJSON() ([]byte, error) { 
    var buffer struct { 
     Result map[string]string `json:"result"` 
    } 
    buffer.Result = make(map[string]string) 
    for _, v := range x.Result { 
     buffer.Result[strconv.Itoa(v.Id)] = v.Status 
    } 
    return json.Marshal(&buffer) 
} 

func (x *StatusReposne) UnmarshalJSON(b []byte) error { 
    var buffer struct { 
     Result map[string]string `json:"result"` 
    } 
    buffer.Result = make(map[string]string) 
    json.Unmarshal(b, &buffer) 
    for k, v := range buffer.Result { 
     k, _ := strconv.Atoi(k) 
     x.Result = append(x.Result, Status{Id: k, Status: v}) 
    } 
    return nil 
} 

var input = `{ 
    "result": { 
    "0": "done", 
    "1": "incomplete", 
    "2": "completed" 
    } 
}` 
관련 문제