Die aus der Box JSON-Codierung in Go ist wirklich schön, aber ich brauche die Ausgabe zu erhalten, indem das Hinzufügen einer Schicht, die ein bestimmtes Format entsprechen. Ich habe einen Weg gefunden, aber ich hatte gehofft, dass es einen einfacheren Weg geben würde, als ich es tue.Gibt es einen einfacheren Weg, um eine Schicht über ein JSON-Objekt mit Golang JSON Kodierung hinzufügen?
Unten ist ein Beispiel dafür, wie ich es mache.
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
}
Ich habe eine Menge von definierten Strukturen, die ich brauchen würde, dies zu tun, so hoffe ich, für eine bessere Lösung, die mich nicht verlassen werden mit mit mehr als 100 Zeilen Code nur einen Wrapper hinzufügen um das JSON-Objekt herum. Idealerweise würde ich gerne etwas haben, das bei dem XML-Elementnamen, der für den XML-Codierer definiert ist, einen Spitzenwert erreichen könnte und diesen zum Umbrechen des JSON verwenden könnte.
In meinem Fall verwende ich die MarshalJSON Funktionen, weil diese Strukturen verschachtelt werden können. Wenn es hilft, weiß ich immer, dass die Abfragestruktur die Stammstruktur ist. Ich hatte das gleiche Problem
Das ist sehr nah. Leider habe ich die Situationen, in denen diese Strukturen verschachtelt sind. So ein Beispiel für die Ausgabe ist '{ "Abfrage": { "Abfragen": [{ "Term-Abfrage": { "text": [ "Daten"]}}]}}'. Deshalb nutze ich die MarshalJSON-Funktionen. – justdewit
@justdewit Siehe überarbeitete Antwort. Lassen Sie mich wissen, ob dies Ihre ursprüngliche Frage genauer angeht. – sberry
Danke! Viel besser als das was ich gemacht habe. – justdewit