将JSON解组为UUID类型

时间:2014-08-12 07:23:55

标签: 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())
}

2 个答案:

答案 0 :(得分:6)

您可能希望确保myuuid中的Data struct变量可见/导出:如“公共”中所示。
类别别名MyUUID(而不是myUUID

也是如此
type MyUUID uuid.UUID

type Data struct {
    Uuid MyUUID
}

来自JSON and Go

  

json包只访问struct类型的导出字段(以大写字母开头的字段)。


commented Ainar G style guide,{{3}}也建议:

  

名称中的单词是首字母缩略词或首字母缩写词(例如“URL”或“NATO”)具有一致的情况。
  例如,“URL”应显示为“URL”或“url”(如“urlPony”或“URLPony”),作为“Url”。以下是一个示例:ServeHTTP而非ServeHttp

     

此规则也适用于“ID”,当它是“标识符”的缩写时,请写“appID”而不是“appId”。

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

type Data struct {
    UUID MyUUID
}

答案 1 :(得分:3)

Go自定义类型don't inherit methods。我使用自定义结构重构代码并附加UnmarshalJSON。

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
}