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
}
}
값을 입력 할 수 없습니다. 내 오류입니다. 나는 그것을 포함해야했다. 당신의 perspicacity 주셔서 감사합니다. – buley