如何在Go结构体中覆盖JSON标签?

huangapple go评论82阅读模式
英文:

How can I override json tags in a Go struct?

问题

我想要编组这个结构体的一部分:

type ValueSet struct {
    Id           string                       `json:"id" bson:"_id"`
    Url          string                       `bson:"url,omitempty" json:"url,omitempty"`
    Identifier   *Identifier                  `bson:"identifier,omitempty" json:"identifier,omitempty"`
    Version      string                       `bson:"version,omitempty" json:"version,omitempty"`
    Name         string                       `bson:"name,omitempty" json:"name,omitempty"`
    Status       string                       `bson:"status,omitempty" json:"status,omitempty"`
    Experimental *bool                        `bson:"experimental,omitempty" json:"experimental,omitempty"`
    Publisher    string                       `bson:"publisher,omitempty" json:"publisher,omitempty"`
    Contact      []ValueSetContactComponent   `bson:"contact,omitempty" json:"contact,omitempty"`
    Date         *FHIRDateTime                `bson:"date,omitempty" json:"date,omitempty"`
    LockedDate   *FHIRDateTime                `bson:"lockedDate,omitempty" json:"lockedDate,omitempty"`
    Description  string                       `bson:"description,omitempty" json:"description,omitempty"`
    UseContext   []CodeableConcept            `bson:"useContext,omitempty" json:"useContext,omitempty"`
    Immutable    *bool                        `bson:"immutable,omitempty" json:"immutable,omitempty"`
    Requirements string                       `bson:"requirements,omitempty" json:"requirements,omitempty"`
    Copyright    string                       `bson:"copyright,omitempty" json:"copyright,omitempty"`
    Extensible   *bool                        `bson:"extensible,omitempty" json:"extensible,omitempty"`
    CodeSystem   *ValueSetCodeSystemComponent `bson:"codeSystem,omitempty" json:"codeSystem,omitempty"`
    Compose      *ValueSetComposeComponent    `bson:"compose,omitempty" json:"compose,omitempty"`
    Expansion    *ValueSetExpansionComponent  `bson:"expansion,omitempty" json:"expansion,omitempty"`
}

这是HL7 FHIR的Go实现的一部分,只包含元数据字段,并省略了三个内容字段(codeSystem、compose和expansion)。我不能(也不应该)更改原始源代码中的JSON标签,因为其他代码强烈依赖于它按照现有方式工作。我该如何告诉json.Marshal覆盖这些结构体元素上的现有JSON标签?

英文:

I'd like to marshal part of this struct:

type ValueSet struct {
	Id           string                       `json:"id" bson:"_id"`
    Url          string                       `bson:"url,omitempty" json:"url,omitempty"`
	Identifier   *Identifier                  `bson:"identifier,omitempty" json:"identifier,omitempty"`
	Version      string                       `bson:"version,omitempty" json:"version,omitempty"`
	Name         string                       `bson:"name,omitempty" json:"name,omitempty"`
	Status       string                       `bson:"status,omitempty" json:"status,omitempty"`
	Experimental *bool                        `bson:"experimental,omitempty" json:"experimental,omitempty"`
	Publisher    string                       `bson:"publisher,omitempty" json:"publisher,omitempty"`
	Contact      []ValueSetContactComponent   `bson:"contact,omitempty" json:"contact,omitempty"`
	Date         *FHIRDateTime                `bson:"date,omitempty" json:"date,omitempty"`
	LockedDate   *FHIRDateTime                `bson:"lockedDate,omitempty" json:"lockedDate,omitempty"`
	Description  string                       `bson:"description,omitempty" json:"description,omitempty"`
	UseContext   []CodeableConcept            `bson:"useContext,omitempty" json:"useContext,omitempty"`
	Immutable    *bool                        `bson:"immutable,omitempty" json:"immutable,omitempty"`
	Requirements string                       `bson:"requirements,omitempty" json:"requirements,omitempty"`
	Copyright    string                       `bson:"copyright,omitempty" json:"copyright,omitempty"`
	Extensible   *bool                        `bson:"extensible,omitempty" json:"extensible,omitempty"`
	CodeSystem   *ValueSetCodeSystemComponent `bson:"codeSystem,omitempty" json:"codeSystem,omitempty"`
	Compose      *ValueSetComposeComponent    `bson:"compose,omitempty" json:"compose,omitempty"`
	Expansion    *ValueSetExpansionComponent  `bson:"expansion,omitempty" json:"expansion,omitempty"`
}

which is part of a Go implementation of HL7 FHIR, including only the metadata fields, and omitting the three content three fields (codeSystem, compose and expansion). I can't (and shouldn't) change the JSON tags in the original source code, since other code strongly depends on it working the way it's written. How can I tell json.Marshal to override the existing JSON tags on these struct elements?

答案1

得分: 5

你可以这样翻译:

你不能改变它,但也不必改变。

最简单的解决方案是创建自己的结构体,定义自己的JSON标签(控制输出中字段的显示方式),复制字段,并将一个自定义结构体的值进行编组。

例如,假设你想编组IdUrl字段,那么可以这样做:

type MyValueSet struct {
    Id  string `json:"MyId"`
    Url string `json:"MyUrl"`
}

var vs ValueSet = ... // 从某个地方获取

mvs := MyValueSet{
    Id:  vs.Id,
    Url: vs.Url,
}

data, err := json.Marshal(&mvs)
// 检查错误
英文:

You can't change it, but you don't have to.

Easiest solution is to create your own struct, define your own json tags (how you want them to appear in the output), copy the fields, and marshal a value of your own struct.

E.g. let's say you want to marshal the Id and Urlfields, then:

type MyValueSet struct {
    Id string  `json:"MyId"`
    Url string `json:"MyUrl"`
}

var vs ValueSet = ... // Comes from somewhere

mvs := MyValueSet {
    Id:  vs.Id,
    Url: vs.Url,
}

data, err := json.Marshal(&mvs)
// Check err

huangapple
  • 本文由 发表于 2016年1月21日 03:48:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/34909177.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定