Sau một số nghiên cứu, tôi đã tìm thấy mejson thư viện, tuy nhiên nó chỉ dành cho Marshaling, vì vậy tôi quyết định viết Unmarshaller.
Kìa ejson
(Tôi đã viết nó), ngay bây giờ nó là một ejson rất đơn giản -> bson trình chuyển đổi, không có bson -> ejson tuy nhiên, bạn có thể sử dụng mejson cho điều đó.
ví dụ :
const j = `{"_id":{"$oid":"53c2ab5e4291b17b666d742a"},"last_seen_at":{"$date":1405266782008},"display_name":{"$undefined":true},
"ref":{"$ref":"col2", "$id":"53c2ab5e4291b17b666d742b"}}`
type TestS struct {
Id bson.ObjectId `bson:"_id"`
LastSeenAt *time.Time `bson:"last_seen_at"`
DisplayName *string `bson:"display_name,omitempty"`
Ref mgo.DBRef `bson:"ref"`
}
func main() {
var ts TestS
if err := ejson.Unmarshal([]byte(j), &ts); err != nil {
panic(err)
}
fmt.Printf("%+v\n", ts)
//or to convert the ejson to bson.M
var m map[string]interface{}
if err := json.Unmarshal([]byte(j), &m); err != nil {
t.Fatal(err)
}
err := ejson.Normalize(m)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", m)
}