我正在尝试使用json.Unmarshaler接口将UUID解组为结构上的uuid.UUID字段.我创建了一个名为myUUID的自定义类型,一切正常,直到我尝试访问通常在uuid.UUID上的方法.我怎么处理这个?我是Go的新手,所以也许我还没有完全理解自定义类型.
package main
import (
"encoding/json"
"errors"
"fmt"
"code.google.com/p/go-uuid/uuid"
)
var jsonstring = `
{
"uuid": "273b62ad-a99d-48be-8d80-ccc55ef688b4"
}
`
type myUUID uuid.UUID
type Data struct {
uuid myUUID
}
func (u *myUUID) UnmarshalJson(b []byte) error {
id := uuid.Parse(string(b[:]))
if id == nil {
return errors.New("Could not parse UUID")
}
*u = myUUID(id)
return nil
}
func main() {
d := new(Data)
err := json.Unmarshal([]byte(jsonstring), &d)
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println(d.uuid.String())
}
Run Code Online (Sandbox Code Playgroud)
您可能希望确保您的myuuid
变量在Data struct
:"public"中可见/导出.
类型别名相同MyUUID
(而不是myUUID
)
type MyUUID uuid.UUID
type Data struct {
Uuid MyUUID
}
Run Code Online (Sandbox Code Playgroud)
来自JSON和Go:
json包只访问struct类型的导出字段(以大写字母开头的字段).
名称中的单词是首字母或首字母缩略词(例如"
URL
"或"NATO
")具有一致的大小写.
例如,"URL
"应显示为"URL
"或"url
"(如"urlPony
"或"URLPony
"),从不显示为"Url
".这是一个例子:ServeHTTP
不是ServeHttp
.
ID
当"标识符"的缩写时,此规则也适用于" ",因此写"appID
"而不是"appId
".
在你的情况下,这意味着:
type Data struct {
UUID MyUUID
}
Run Code Online (Sandbox Code Playgroud)
Go 的自定义类型不继承方法。我使用自定义结构重构了代码并附加了 UnmarshalJSON。
import (
"errors"
"strings"
"github.com/pborman/uuid"
)
type ServiceID struct {
UUID uuid.UUID
}
type Meta struct {
Name string `json:"name"`
Version string `json:"version"`
SID *ServiceID `json:"UUID"`
}
func (self *ServiceID) UnmarshalJSON(b []byte) error {
s := strings.Trim(string(b), "\"")
self.UUID = uuid.Parse(s)
if self.UUID == nil {
return errors.New("Could not parse UUID")
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3247 次 |
最近记录: |