gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:26:04 26 4
gpt4 key购买 nike

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
}

我有很多定义的结构需要执行此操作,所以我希望有一个更好的解决方案,它不会让我有 100 多行代码只为 JSON 对象添加一个包装器.理想情况下,我想要一些可以达到为 XML 编码器定义的 XML 元素名称并使用它来包装 JSON 的东西。

在我的例子中,我使用的是 MarshalJSON 函数,因为这些结构可以嵌套。如果有帮助,我总是知道查询结构是根结构。

最佳答案

当我开始使用 Go & Json 时,我遇到了同样的问题。我通过那个解决了它

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

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

关于json - 有没有更简单的方法使用 Golang JSON 编码在 JSON 对象上添加层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29689092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com