2013-08-17 6 views
0

Here is the code :JSON 비 정렬 화 reflect.Type

package main 

import (
    "fmt" 

    "encoding/json" 
    "reflect" 
) 

var(
    datajson []byte 
) 

type User struct { 
    Name string 
    Type reflect.Type 
} 

func MustJSONEncode(i interface{}) []byte { 
    result, err := json.Marshal(i) 
    if err != nil { 
     panic(err) 
    } 
    return result 
} 
func MustJSONDecode(b []byte, i interface{}) { 
    err := json.Unmarshal(b, i) 
    if err != nil { 
     panic(err) 
    } 
} 
func Store(a interface{}) { 
    datajson = MustJSONEncode(a) 
    fmt.Println(datajson) 
} 

func Get(a []byte, b interface{}) { 
    MustJSONDecode(a, b) 
    fmt.Println(b) 
} 

func main() { 
    dummy := &User{} 
    david := &User{Name: "DavidMahon"} 
    typ := reflect.TypeOf(david) 
    david.Type = typ 
    Store(david) 
    Get(datajson, dummy) 
} 

내가 성공적으로 reflect.Type를 마샬링 할 수 있지만 나는 반대를 수행 할 때, 그것은 패닉. 나는 reflect.Type가 인터페이스 인 것을 알고있다. 여기서 내가 뭘 잘못하고 있니? json에서 reflect.Type 값을 저장 한 다음 안전하게 다시 검색하려면 어떻게해야합니까?

답변

1

그건 의미가 없습니다. JSON 패키지가 어떤 데이터를 디코딩해야 하는지를 알 수있는 방법이 없습니다. 이 인터페이스는 struct{} 유형, int 유형 및 struct{ Value1, Value2 int } 유형으로 구현 될 수 있습니다. 더 나쁜 것은, 바이너리 (수입 누락, 불필요한 코드 제거 등)의 일부가 아닌 다른 유형도있을 수 있습니다. 그렇다면 JSON에서 어떤 유형으로 돌아갈 것으로 기대하십니까?

다른 방법을 찾아야 할 수도 있습니다. 예를 들어, json.Unmarshaler 인터페이스를 구현하고, 식별자를 비 정렬 화하고 해당 식별자를 사용하여 다음 데이터를 구체적인 유형으로 비 정렬화할 수 있습니다. 그럴 필요가있는 switch 문은 또한 콘크리트 유형이 (사용하고 있기 때문에) 바이너리의 일부인지 확인합니다.

하지만 더 쉬운 해결책이있을 것입니다. 귀하의 질문은 당신이 아카이브하려는 것을 말하지 않습니다. 문자열 형식으로 이름을 마샬링/언 마샬링하는 것으로 충분할까요?

+0

데이터베이스에 특정 유형의 객체와 같은 데이터를 저장하려고합니다. 해당 데이터를 저장하기 위해 json으로 마샬링해야합니다. 내 개체에 반사 세부 정보 (개체의'Type')가 있습니다. 그래서 기본적으로 모든 유형의 데이터를 저장하고 다시 가져올 수 있습니다. 데이터베이스는 내가 사용하는 맞춤형 데이터베이스입니다. 나는 단지'reflect.Type' 타입의 데이터를 저장하고 안전하게 되돌려 놓는 방법을 원한다. – Minty

+0

타입의 이름을 저장하는 것을 생각했지만, 어떻게 구체적인 타입을 얻을 수 있을까요? 나는 당황 스럽다 – Minty

+0

데이터베이스에 다른 유형의 객체를 저장하려는 경우, 유형의 이름 만 들어있는 "유형"필드를 추가 할 수 있습니다. 그런 다음 타입 필드를 먼저 디코딩해야만합니다 (타입을'struct {Type string}'으로 디코딩). – tux21b