当前位置: 首页 > 面试题库 >

如何动态更改结构的json标签?

贺博厚
2023-03-14
问题内容

我有以下几点:

package main

import (
    "encoding/json"
    "fmt"
    "os"
    "reflect"
)

type User struct {
    ID   int64  `json:"id"`
    Name string `json:"first"` // want to change this to `json:"name"`
    tag  string `json:"-"`
    Another
}

type Another struct {
    Address string `json:"address"`
}

func (u *User) MarshalJSON() ([]byte, error) {
    value := reflect.ValueOf(*u)
    for i := 0; i < value.NumField(); i++ {
        tag := value.Type().Field(i).Tag.Get("json")
        field := value.Field(i)
        fmt.Println(tag, field)
    }
    return json.Marshal(u)
}

func main() {
        anoth := Another{"123 Jennings Street"}
    _ = json.NewEncoder(os.Stdout).Encode(
        &User{1, "Ken Jennings", "name",
             anoth},
    )
}

我正在尝试对结构进行json编码,但是在我需要更改json键之前,例如,最终的json应该如下所示:

{"id": 1, "name": "Ken Jennings", "address": "123 Jennings Street"}

我注意到value.Type()。Field(i).Tag.Get(“ json”)的方法,但是没有设置方法。为什么?以及如何获取所需的json输出。

另外,如何遍历所有字段,包括嵌入式结构Another?

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


问题答案:

这很麻烦,但是如果您可以将该结构包装在另一个结构中,并使用新的结构进行编码,则可以:

  1. 编码原始结构,
  2. 解码为interface{}以获得地图
  3. 更换地图钥匙
  4. 然后对地图进行编码并返回

从而:

type MyUser struct {
    U User
}

func (u MyUser) MarshalJSON() ([]byte, error) {
    // encode the original
    m, _ := json.Marshal(u.U)

    // decode it back to get a map
    var a interface{}
    json.Unmarshal(m, &a)
    b := a.(map[string]interface{})

    // Replace the map key
    b["name"] = b["first"]
    delete(b, "first")

    // Return encoding of the map
    return json.Marshal(b)
}

在操场上:https :
//play.golang.org/p/TabSga4i17



 类似资料:
  • 问题内容: 我正在一个项目中使用JSON作为创建Java对象的配置框架。这也是我来自CF / PHP / JS等方面多年经验的第一个专业Java项目。 在将JSON转换为Java时,我能找到的所有资源都基于以下想法:您必须先在Java中手动构建对象,即POJO,然后使用JSON进行填充。 作为网络语言的资深人士,我对此想法感到窒息。我发现编译后的语言起着不同的作用,但是我认为从命令行到机器语言的共

  • 问题内容: 我有一个网页,该网页实现了一组标签,每个标签显示不同的内容。选项卡单击不会刷新页面,而是在客户端隐藏/取消隐藏内容。 现在,需要根据页面上选择的选项卡来更改页面标题(出于SEO的原因)。这可能吗?有人可以提出一种解决方案,以通过javascript动态更改页面标题而无需重新加载页面吗? 问题答案: 更新 :根据SearchEngineL上的注释和参考,大多数网络爬虫将为更新的标题编制索

  • 我有以下元素,我想单击每个选项卡并检查输入字段中是否存在值,我想避免为每种语言创建每个WebElement 谁能告诉我怎么办。否则,我会为每种语言安装元素,并单击并检查文本区域,因此如果可以操纵xpath或css,那就太棒了 提前非常感谢各位。

  • 问题内容: 我有一堂课,里面也有变量。有时我想忽略某些字段,有时在反序列化时不想忽略(也许也在序列化时)。在Jackson怎么办? 问题答案: 对于序列化,“ 过滤属性 ”博客条目应该会有所帮助。反序列化方面的支持较少,因为更常见的是要过滤掉所写的内容。 一种可能的方法是子类化,重写使方法(和/或字段)具有可忽略性的方法,以使用所需的任何逻辑。 如果您举了一个实际应用的例子,这也可能会有所帮助,即

  • 问题内容: http://play.golang.org/p/wYgfLLQYdm 请参阅上面的示例。在我的示例中,方法执行后变量更改不会持续。如何使用struct方法更改struct变量的值? 问题答案: 您的方法接收者是一个值,而不是一个指针。 那意味着那些方法像操作对象的 副本 。 也可以看看: 常见问题“ 我应该在值或指针上定义方法吗? ”。 “ 在Golang中不要被指针与非指针方法接收

  • 问题内容: 我需要动态添加组件。此外,我需要动态更改布局。 问题答案: 作为参考,以下是显示基本方法的脚本validate()。这个更精致的示例显示了两个要求:它更改布局并动态添加组件。