2013-08-17 48 views
5

Here is the codeunmarshal trên giá trị phản ánh

package main 

import (
    "fmt" 

    "encoding/json" 
    "reflect" 
) 

var (
    datajson []byte 
    //ref mapp 
) 

type mapp map[string]reflect.Type 

type User struct { 
    Name string 
    //Type map[string]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{}) { 
    objType := reflect.TypeOf(b).Elem() 
obj := reflect.New(objType) 
//fmt.Println(obj) 
MustJSONDecode(a, &obj) 
fmt.Printf("%s", obj) 
    } 

func main() { 

    dummy := &User{} 
    david := User{Name: "DavidMahon"} 

    Store(david) 
    Get(datajson, dummy) 

} 

Trong chức năng Nhận

func Get(a []byte, b interface{}) { 
    objType := reflect.TypeOf(b).Elem() 
obj := reflect.New(objType) 
//fmt.Println(obj) 
MustJSONDecode(a, &obj) 
fmt.Printf("%s", obj) 
    } 

Tôi không thể unmarshal các json vào loại đối tượng cơ bản.

Có gì sai ở đây? Tôi bị kẹt ở đây. Một cái gì đó rất đơn giản nhưng rất khó để tìm ra.

Cảm ơn

CẬP NHẬT :: Mục tiêu của vấn đề này là để truy xuất một đối tượng hình thành đầy đủ các loại thông qua chức năng Nhận.

Cách tiếp cận được đề cập bởi Nick trên nhận xét bên dưới không đưa cho tôi đối tượng thực tế mà tôi đã thử trước đây. Tôi có thể truy xuất dữ liệu (ngay cả khi đối tượng có các đối tượng đệ quy bên dưới) trong một bản đồ như thế này

func Get(a []byte) { 
    var f interface{} 

    //buf := bytes.NewBuffer(a) 
    //v := buf.String() 
    //usr := &User{} 

    MustJSONDecode(a, &f) 
    fmt.Printf("\n %v \n", f) 
} 

Tuy nhiên tôi cần đối tượng thực sự không chỉ là dữ liệu. Một cái gì đó như user := &User{"SomeName"} nơi tôi cần user đối tượng trở lại từ Unmarshall. Bí quyết là một nơi nào đó trong sự phản ánh nhưng không biết làm thế nào.

+0

Phản ánh sẽ không làm những gì bạn nghĩ. Bạn không thể xây dựng một đối tượng tùy ý bằng cách sử dụng nó. Bạn có thể cobble một cái gì đó với nhau bằng cách sử dụng phản ánh và không an toàn nhưng thực sự bạn nên suy nghĩ lại những gì bạn đang cố gắng để làm. –

+0

Cảm ơn tôi đang đóng chuỗi này. Cảm ơn bạn đã dành thời gian. Đã +1 câu trả lời của bạn. – Minty

Trả lời

3

Tôi đang bối rối là tại sao bạn muốn làm điều này, nhưng ở đây là làm thế nào để sửa chữa nó

func Get(a []byte, b interface{}) { 
    objType := reflect.TypeOf(b).Elem() 
    obj := reflect.New(objType).Interface() 
    //fmt.Println(obj) 
    MustJSONDecode(a, &obj) 
    fmt.Printf("obj = %#v\n", obj) 
} 

Lưu ý các cuộc gọi đến Interface().

Playground link

Dường như với tôi rằng bạn đang đi đến rất nhiều khó khăn để thực hiện một trống &User khi bạn đã có một trong b, ví dụ:

func Get(a []byte, b interface{}) { 
    MustJSONDecode(a, &b) 
    fmt.Printf("obj = %#v\n", b) 
} 

Nhưng tôi đoán có một số chi tiết cho kế hoạch này không rõ ràng ở đây!

+0

Cảm ơn nhưng tôi đã thử trò lừa.Có hai vấn đề này. – Minty

+0

1. Nó sẽ không hoạt động trên các kiểu đối tượng đệ quy. Đó là các đối tượng bên trong các đối tượng và 2. Dữ liệu trả về không phải là một đối tượng của kiểu được gửi trong hàm Funtion. Đó là một phần khó khăn. Tôi đã cập nhật câu hỏi của mình để làm rõ điều đó. – Minty

+0

Vật gì đã trả về? Bạn không trả lại một đối tượng. b đã là kiểu đúng được phổ biến bởi lệnh gọi hàm MustJSONDecode. –

1

reflect.New(objType) trả về một reflect.Value Điều này không phải là giao diện bạn đã truyền. Theo tài liệu cho Value Đó là cấu trúc chỉ với các trường chưa được xuất bản. gói json không thể làm việc với các trường chưa được xuất. Vì nó không phải là cùng một đối tượng khi bạn truyền vào và nó thậm chí không json có thể giải mã/giải mã được gói json sẽ thất bại.

Có thể bạn sẽ thấy bài viết Laws of Reflection hữu ích trong khi cố gắng sử dụng gói phản ánh.

+0

Cảm ơn bạn đã tham khảo. Tôi đọc rằng ba lần nhưng tôi nghĩ rằng tôi nhận thấy rằng bài viết này (mà btw là rất intimating) không nói về việc tạo ra các đối tượng từ các đối tượng khác. Có thể bethe tác giả giữ rằng đó là một phần của nhà phát triển theo ý mình. – Minty

+1

Bạn không thể thực sự sử dụng phản ánh để tạo ra một đối tượng của một loại cụ thể theo cách bạn mô tả. Bạn có thể sử dụng phản ánh để xem * if * một đối tượng thuộc một loại cụ thể nhưng không phải để xây dựng một loại tùy ý. –