如何在go中标记一个结构,以便它从JSON读取值但不写入它们?

时间:2013-09-12 04:08:18

标签: json go

我有以下结构,我想从JSON和Write to JSON中读取。我想读取PasswordHash属性(反序列化它),但在编写对象时跳过(序列化)。

是否可以标记对象以使其在反序列化时被读取但在序列化时被忽略? json:"-"似乎在两个操作中跳过该字段。

type User struct {

    // Must be unique
    UserName string

    // The set of projects to which this user has access
    Projects []string

    // A hash of the password for this user
    // Tagged to make it not serialize in responses
    PasswordHash string `json:"-"`

    // Is the user an admin
    IsAdmin bool
}

我的反序列化代码如下:

var user User
content = //Some Content
err := json.Unmarshal(content, &user)

,序列化代码为:

var userBytes, _ = json.Marshal(user)
var respBuffer bytes.Buffer
json.Indent(&respBuffer, userBytes, "", "   ")
respBuffer.WriteTo(request.ResponseWriter)

2 个答案:

答案 0 :(得分:5)

我认为你不能用json标签做到这一点,但看起来像输入用户和输出用户实际上是不同的语义对象。最好在代码中将它们分开。这样很容易达到你想要的效果:

type UserInfo struct {
    // Must be unique
    UserName string

    // The set of projects to which this user has access
    Projects []string

    // Is the user an admin
    IsAdmin bool
} 

type User struct {
    UserInfo

    // A hash of the password for this user
    PasswordHash string
}

您的反序列化代码保持不变。序列化代码在一行中更改:

var userBytes, _ = json.Marshal(user.UserInfo)

play.golang.com

答案 1 :(得分:1)

你无法用标签做到这一点。您必须实施json.Marshaler才能排除要排除的字段。

为结构编写MarshalJSON会有点棘手,因为你不想重写整个编组。我建议您有一个type Password string,并为此编写封送程序以返回空的JSON表示形式。