我有以下结构,我想从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)
答案 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)
答案 1 :(得分:1)
你无法用标签做到这一点。您必须实施json.Marshaler
才能排除要排除的字段。
为结构编写MarshalJSON
会有点棘手,因为你不想重写整个编组。我建议您有一个type Password string
,并为此编写封送程序以返回空的JSON表示形式。