在Go Lang中为整个结构设置标记

时间:2014-01-05 09:57:32

标签: google-app-engine go google-cloud-datastore lang

我正在使用Go和GoRestful将RESTFUL前端编程到存储在Google App Engine数据存储区中的某些实体。

数据转换为JSON / XML,并通过控制每种格式样式的标签呈现给用户。我怎样才能将标签应用于结构本身的名称,以便使用正确的样式输出?

我的结构的一个例子是:

type Shallow struct {
    Key          string    `datastore:"-" json:"key" xml:"key"`
    LastModified time.Time `json:"last_modified" xml:"last-modified"`
    Version      int       `json:"version" xml:"version"`
    Status       int       `json:"status" xml:"status"`
    Link         Link      `datastore:"-" json:"link" xml:"link"`
    Name         string    `json:"name" xml:"name"`
}

type ProbabilityEntry struct {
    ItemId      int64   `datastore:"ItemId" json:"item_id" xml:"item-id"`
    Probability float32 `datastore:"Probability" json:"probability" xml:"probability"`
    Quantity    int16   `datastore:"Quantity" json:"quantity" xml:"quantity"`
}

type LootTable struct {
    Shallow
    AllowPreload  bool               `json:"allow_preload" xml:"allow-preload"`
    Probabilities []ProbabilityEntry `json:"probabilities" xml:"probabilities"`
}

当LootTable结构发送到JSON / XML时,它应该将自己表示为“loot_table”或“loot-table”而不是“LootTable”。

1 个答案:

答案 0 :(得分:4)

简单回答:

将其包裹在外部结构中:

type Payload struct {
   Loot LootTable `json:"loot_table"`
}

更长的答案:

如果JSON的接收者知道他们得到了什么,那么这不是必需的。但是,在构建JSON API时,我经常创建一个Response结构,其中包含有关请求的额外详细信息,其中可能包括响应的类型。这是一个例子:

type JSONResponse struct {
   Obj    interface{} `json:"obj"`    // Marshall'ed JSON (not wrapped)
   Type   string      `json:"type"`   // "loot_table" for example
   Ok     bool        `json:"ok"`     // Does this response require error handling?
   Errors []string    `json:"errors"` // Any errors, you could leave out Ok and just check this
}

同样,通过API调用,您通常会知道您期望的是什么,但如果响应可以是多种类型之一,则此方法可以提供帮助。