将JSON解组为UUID类型

Kyl*_*yle 5 json go

我正在尝试使用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)

Von*_*onC 6

您可能希望确保您的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类型的导出字段(以大写字母开头的字段).


正如Ainar G 评论那样,风格指南还建议:

名称中的单词是首字母或首字母缩略词(例如" URL"或" NATO")具有一致的大小写.
例如," URL"应显示为" URL"或" url"(如" urlPony"或" URLPony"),从不显示为" Url".这是一个例子:ServeHTTP不是ServeHttp.

ID当"标识符"的缩写时,此规则也适用于" ",因此写" appID"而不是" appId".

在你的情况下,这意味着:

type Data struct {
    UUID MyUUID
}
Run Code Online (Sandbox Code Playgroud)


Kyl*_*yle 6

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)