2016-10-30 1 views
2

나는 서버에서 응답이 유형의 구문 분석하려고 해요 : 메시지의 유형에 대한 내 자신의 hack'ish 파서를 작성 외에도구문 분석 명시 적으로 배열

[[1,"a","b",2,"000000",[[1,2,3],[1,2,3]],"x","y","z",[[1,2,3],[1,2,3]]]] 

이것을 해석하는 표준 방법이 그 I 알지 못해?

답변

4

입력 내용은 JSON 문자열입니다. Go에서는 encoding/json 패키지를 사용하여 디코드 할 수 있습니다.

일반적으로 JSON 문자열의 구조를 미리 알면 Go struct 유형을 구성하여 모델링 한 다음 struct 유형의 값으로 언 마샬링 할 수 있습니다.

구조를 알 수 없거나 변화하는 경우, 당신이 어떤 JSON 데이터의 대상이 될 수있는 유형 interface{}의 값으로 비 정렬 화 수

s := `[[1,"a","b",2,"000000",[[1,2,3],[1,2,3]],"x","y","z",[[1,2,3],[1,2,3]]]]` 

var v interface{} 
if err := json.Unmarshal([]byte(s), &v); err != nil { 
    fmt.Println(err) 
    return 
} 
fmt.Println(v) 
fmt.Printf("%#v\n", v) 

출력합니다 (Go Playground에 그것을 시도) :

[[1 a b 2 000000 [[1 2 3] [1 2 3]] x y z [[1 2 3] [1 2 3]]]] 
[]interface {}{[]interface {}{1, "a", "b", 2, "000000", []interface {}{[]interface {}{1, 2, 3}, []interface {}{1, 2, 3}}, "x", "y", "z", []interface {}{[]interface {}{1, 2, 3}, []interface {}{1, 2, 3}}}} 

결과에서 볼 수 있듯이 다양한 유형의 요소 (JSON 번호, 문자열 및 훨씬 많은 조각)가있는 슬라이스 조각이 생성됩니다. 당신이 값을 "추출"을 type assertion를 사용할 필요로 물론

[]interface{}{ 
    []interface{}{ 
     1, "a", "b", 2, "000000", 
     []interface{}{ 
      []interface{}{1, 2, 3}, 
      []interface{}{1, 2, 3}}, 
     "x", "y", "z", 
     []interface{}{ 
      []interface{}{1, 2, 3}, 
      []interface{}{1, 2, 3}, 
     }, 
    }, 
} 

이 매우 편리되지 않습니다 :

여기 (이동의 composite literal 구문을 사용하여) 그것의 더 나은 느낌을 얻을 들여 쓰기를 추가 동일한 출력을입니다

fmt.Printf("%T %[1]v\n", v.([]interface{})[0].([]interface{})[0]) 
fmt.Printf("%T %[1]v\n", v.([]interface{})[0].([]interface{})[1]) 

출력 : 01,235

interface{} 유형이 "일반"의 값, 예를 들면 (또한 검증을 위해 자신의 형태를 인쇄) 제 2 비 - 배열의 값을 추출
float64 1 
string a 

Go의 JSON 번호는 정수가 될 수 있지만 (다른 유형이 명시 적으로 지정되지 않은 경우) float64 유형의 값에 언 마샬링된다는 점에 유의해야합니다.