golang json.unmarshal 只解析非空

restful的情况下,需要PUT更新一个资源
但是PUT操作仅更新一个字段,如下:

{
"userid":1,
"username":"admin",
"userpass":"xxxx"
}

我仅仅想要更新username,
但是put("/api/users/1")
需要PUT整个

{
"userid":1,
"username":"admin",
"userpass":"xxxx"
}

不然解析之后,字段全部被覆盖
json.Unmarshal(c.Ctx.Input.RequestBody, &v)
现在想要是不解析空字段,这样就不会覆盖&v

阅读 10.1k
3 个回答
type User struct {
    Userid   *int
    Username *string
    Userpass *string
}

定义一个struct

type Param struct {
    UserId int  `json:"userid"`
    Username string `json:"username,omitempty"`
    Userpass string `json:"userpass,omitempty"`
}

var v Param
json.Unmarshal(c.Ctx.Input.RequestBody, &v)
import (
    "encoding/json"
    "fmt"
)
    
func main() { 
    fmt.Println("vim-go")
    buf, _ := json.Marshal(&struct {
        EmptyString     string
        OmitEmptyString string `json:"OmitEmptyString,omitempty"` 
    }{
        OmitEmptyString: "",
        EmptyString:     "",
    })
    
    fmt.Println("output:%s\n", string(buf))

然而,我更建议这样写

http.Put(struct {
    userid int
    username string
})

如果用原有结构put,那么当不小心传入一个非空字符串时,就会更新,这是个坑

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏