2013-08-28 7 views
0

(정적 스키마) json 파일에서 큰 데이터 세트를 디코드하려고합니다. 이 파일에는 숫자 데이터 만 포함되며 키는 모두 정수입니다. json.Unmarshal을 사용하여 map[string]int 또는 map[string]float32 필드를 포함하는 구조체로이 json을 디코딩하는 방법을 알고 있습니다. 하지만 문자열 키에 관심이 없기 때문에 어떻게 든 int로 변환해야합니다.json 디코드 키 유형

그래서 내가 알고 싶은 것입니다 :

  1. 이 달성 할 수있는 방법이 있나요,지도의 필드를 포함하는 구조체를 받고 .IE [INT]를 디코딩에서 직접 입력 float32, 그렇지 않으면
  2. 어떻게 효율적으로 메모리에 디코딩 후 이것을 달성하기 위해?

감사

+0

힌트 : http://jsonlint.com/을 통해 json 파일을 실행하여 "json"에 대한 느낌을 확인하십시오. – Crisfole

+1

'결과 유효한 JSON.' 내 json 파일에 문제가 있음을 언급 한 적이 있습니까? – ybycode

+0

아니요.하지만 json 파일에서 숫자를 키로 사용하면 잘못되어 대부분의 json 도구가 자동으로 문자열로 변환됩니다. 인코딩/json 패키지를 포크하여 원하는대로 만들 수 있습니다. 그러나 어쨌든 내 투표는 @ ANisus의 (올바른) 대답은 – Crisfole

답변

6

문자열 키를 가진 JSON format 만 지정 키/값 객체. 이 때문에 encoding/json 패키지는 문자열 키만 지원합니다.

json/encoding 문서 상태 : JSON 문자열
[] 인터페이스 {}, JSON 배열에 대한
지도 [문자열을 JSON의 불리언 JSON 번호에 대한
float64,
문자열

부울, ] 인터페이스 {}, JSON 객체
JSON 용 null

당신이 encoding/json 패키지를 사용하여지도 [INT] float64로를 통해 이동하려는 경우, 다음을 수행 할 수 있습니다 (물론 float32와 함께 작동) :

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    a := map[string]float64{"1":1, "2":4, "3":9, "5":25} 
    b := make(map[int]float64, len(a)) 

    for k,v := range a { 
     if i, err := strconv.Atoi(k); err == nil { 
      b[i] = v 
     } else { 
      // A non integer key 
     } 
    } 

    fmt.Printf("%#v\n", b) 
} 

Playground

0

encoding/json 패키지가 포함되어 있습니다 인터페이스 Unmarshaler에는 UnmarshalJSON(data []byte) error이라는 단일 메소드가 있습니다. 당신은 용감 느낌이 있다면

당신은 다음과 같은 사항에 대해 그것을 구현할 수 :

type IntToFloat map[int]float32 

func (itf *IntToFloat) UnmarshalJSON(data []byte) error { 
    if itf == nil { 
     return errors.New("Unmarshalling JSON for a null IntToFload") 
    } 
    // MAGIC Goes here. 
    return nil 
} 

편집

주 : 비 정렬 화의 표준 라이브러리 버전이 어디에서 오는지 http://golang.org/src/pkg/encoding/json/decode.go?s=2221:2269#L53이다.

http://golang.org/pkg/encoding/json/#Unmarshaler은 위에서 언급 한 인터페이스의 출처입니다.

+1

이 답변을 주셔서 감사합니다! 나는이 기술을 사용하기 위해 지금 당장 숙련되어 있다고 확신하지 않는다. ^^ – ybycode