为了账号安全,请及时绑定邮箱和手机立即绑定

是否有更简单的方法使用 Golang JSON 编码在 JSON 对象上添加层?

是否有更简单的方法使用 Golang JSON 编码在 JSON 对象上添加层?

Go
翻过高山走不出你 2021-09-27 21:27:21
Go 中开箱即用的 JSON 编码非常好,但我需要通过添加层来使输出匹配特定格式。我已经想出了一种方法,但希望有一种比我正在做的方法更简单的方法。下面是我如何做的一个例子。import (  "bytes"  "encoding/json"  "encoding/xml"  "fmt")type Query struct {    XMLName xml.Name      `xml:"http://marklogic.com/appservices/search query" json:"-"`    Format  int           `xml:"-" json:"-"`    Queries []interface{} `xml:",any" json:"queries"`}type TermQuery struct {    XMLName xml.Name `xml:"http://marklogic.com/appservices/search term-query" json:"-"`    Terms   []string `xml:"http://marklogic.com/appservices/search text" json:"text"`    Weight  float64  `xml:"http://marklogic.com/appservices/search weight,omitempty" json:"weight,omitempty"`}// use fakeQuery to avoid an infinite looptype fakeQuery Query//MarshalJSON for Query struct in a special way to add wraping {"query":...}func (q Query) MarshalJSON() ([]byte, error) {    return wrapJSON(`query`, fakeQuery(q))}// use fakeTermQuery to avoid an infinite looptype fakeTermQuery TermQuery//MarshalJSON for TermQuery struct in a special way to add wraping {"term-query":...}func (q TermQuery) MarshalJSON() ([]byte, error) {    return wrapJSON(`term-query`, fakeTermQuery(q))}func wrapJSON(name string, item interface{}) ([]byte, error) {    var buffer bytes.Buffer    b, err := json.Marshal(item)    buffer.Write([]byte(`{"`))    buffer.Write([]byte(name))    buffer.Write([]byte(`":`))    buffer.Write(b)    buffer.Write([]byte(`}`))    return buffer.Bytes(), err}我有很多定义的结构需要这样做,所以我希望有一个更好的解决方案,不会让我留下 100 多行代码来只在 JSON 对象周围添加一个包装器。理想情况下,我想要一些可以在为 XML 编码器定义的 XML 元素名称处达到峰值的东西,并使用它来包装 JSON。就我而言,我使用的是 MarshalJSON 函数,因为这些结构可以嵌套。如果有帮助,我总是知道 Query 结构是根结构。
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

当我开始使用 Go & Json 时,我遇到了同样的问题。我是这样解决的


func wrapJSON(name string, item interface{}) ([]byte, error) {

    wrapped := map[string]interface{}{

       name: item,

    }

    converted, err := json.Marshal(wrapped)

    return converted

}

理想情况下,将您的方法重命名wrapJSON为wrap返回接口,然后将此接口转换为 JSON 或 XML


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信