首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用自定义MarshalJSON更改结构中的JSON标记

使用自定义MarshalJSON更改结构中的JSON标记
EN

Stack Overflow用户
提问于 2018-06-08 03:31:51
回答 2查看 1.7K关注 0票数 1

我们得到一些JSON输入,解组,执行一些工作,然后编组并转移到其他地方。我们得到的JSON可能有一个名为"user“的字段。当我们编组回JSON时,我们需要将字段"user“更改为"username”。我们可以通过创建一个具有所有相同字段但不同JSON标记的新结构来做到这一点,但这看起来有点麻烦。我以为自定义编组程序可以在这里工作,但我有点卡住了。考虑下面的代码。

代码语言:javascript
运行
复制
package main

import (
    "encoding/json"
    "fmt"
)

type StructA struct {
    Username string `json:"user"`
    Process  string `json:"process"`
}

func main() {

    var test1 StructA
    err := json.Unmarshal([]byte(`{"user": "user123", "process": "something"}`), &test1)
    if err != nil {
        fmt.Println(err)
    }

    // do some work with test1

    jsonByte, err := json.Marshal(&test1)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(jsonByte))

}

func (u *StructA) MarshalJSON() ([]byte, error) {
    type Alias StructA
    return json.Marshal(&struct {
        Username string `json:"username"`
        *Alias
    }{
        Username: u.Username,
        Alias:    (*Alias)(u),
    })
}

https://play.golang.org/p/_w0rlQrcgrW

理想情况下,这将允许我将该字段上的JSON标记从"user“更改为"username”。但是,我同时得到了"username“和"user”。

代码语言:javascript
运行
复制
{"username":"user123","user":"user123","process":"something"}

我当然可以创建一个全新的结构,用我想要的标签映射StructA,但我不必复制每个字段并担心保持这两个结构的同步。这不是世界末日,但这似乎不是一个好的方法。

需要说明的是,我想要的最终结果如下:

代码语言:javascript
运行
复制
{"username":"user123","process":"something"}

我肯定我错过了一些微不足道的东西,但这是漫长的一周,任何帮助都将不胜感激。谢谢!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50748919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档