2014-08-30 6 views
3

map[string]interface{}으로 이동하여 인터페이스의 혼합 문자열, 부동 및 슬라이스 값을 사용하여 PlaceNode 구조체의 필드 값을 채우는 JSON을 비 정렬 화합니다.이동에 동적 구조 필드를 어떻게 설정합니까?

모든 JSON 개체가 모든 구조체 필드를 가지고 있지 않기 때문에 "기본값"과 같은 것이 필요합니다. 다른 언어 배경에서 오는 Structs 인덱싱 가능 여부는 n Placenode 변수 (예 : 자바 스크립트에서 self 또는 this 키워드 인 것처럼)에 값을 설정하는 데 익숙합니다.

n[key] = value; 

대신, 나는 interface{}을 읽을 reflect를 사용하여 선택적 필드가 설정 될 수있는 경우에 값을 할당하는 내 PlaceNode 구조체의 방법이있다. 내 interfaces{}은 모든 값을 구현하지 않으므로 구조체에 직접 unmarshaling하는 데 문제가 있습니다.

필드 중 아무 것도이 s.CanSet() 수표를 전달하지 않습니다. 그래서 나는이 잘못에 대해 가봐야 만합니다.

이동에 동적 구조 필드를 어떻게 설정합니까?

func (n PlaceNode) New(data map[string]interface{}) PlaceNode { 
    for key, val := range data { 
     n.Id = key 
     for k, v := range val.(map[string]interface{}) { 
      f := reflect.ValueOf(v) 
      st := reflect.ValueOf(n) 
      if (st.Kind() == reflect.Struct) { 
       s := st.FieldByName(k) 
       if f.Kind() == reflect.String && true == s.CanSet() { 
         s.SetString(f.String()); 
       } else if f.Kind() == reflect.Float64 && true == s.CanSet() { 
         s.SetFloat(f.Float()); 
       } else if f.Kind() == reflect.Slice && true == s.CanSet() { 
         s.Set(f.Slice(0, f.Len())); 
       } 
      } 
     } 
    } 
    return n 
} 

data 인수 map[string]interface{}map[string]interface{}이며,이처럼 보이는 인터페이스를 가지고 :

다음 호출 할
{ 
    "XV.12A": { 
    "Area": 1189.132667, 
    "CensusBlock": 2032, 
    "CensusBlockGroup": 2, 
    "CensusCbsaFips": 40900, 
    "CensusCountyFips": 61, 
    "CensusMcdFips": 90160, 
    "CensusMsaFips": 6922, 
    "CensusPlaceFips": 3204, 
    "CensusStateFips": 6, 
    "CensusTract": 203, 
    "CensusYear": 2010, 
    "Radius": 19.455402434548, 
    "RegionSize": 1189.132667 
    } 
} 

답변

7

:

st := reflect.ValueOf(n) 

ValueOf이 통과 사본을 PlaceNode 구조체 따라서 st에 대한 변경 사항은 n에 표시되지 않습니다. 이런 이유로 패키지는 이와 같은 경우를 주소 지정이 불가능한 값으로 처리합니다.

st := reflect.ValueOf(&n).Elem() 

지금 st 오히려 사본보다 n와 직접 협력하고, 주소입니다 : 당신이 n represernts reflect.Value을 원하는 경우에, 이런 식으로 뭔가를 사용해보십시오. 이제 다양한 필드와 필드에 다양한 Set* 메서드를 사용할 수 있습니다.

+0

값을 입력 할 수 없습니다. 내 오류입니다. 나는 그것을 포함해야했다. 당신의 perspicacity 주셔서 감사합니다. – buley

관련 문제