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

jus*_*wit 5 json go

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 loop
type 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 loop
type 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
}
Run Code Online (Sandbox Code Playgroud)

我有很多定义的结构,我需要这样做,所以我希望有一个更好的解决方案,不会让我有100多行代码只是添加一个围绕JSON对象的包装器.理想情况下,我希望能够在为XML编码器定义的XML元素名称处达到顶峰并使用它来包装JSON.

在我的情况下,我使用MarshalJSON函数,因为这些结构可以嵌套.如果有帮助我总是知道Query结构是根结构.

Man*_*asp 6

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

func wrapJSON(name string, item interface{}) ([]byte, error) {
    wrapped := map[string]interface{}{
       name: item,
    }
    converted, err := json.Marshal(wrapped)
    return converted
}
Run Code Online (Sandbox Code Playgroud)

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