Việc ra khỏi hộp JSON mã hóa trong Go là thực sự tốt đẹp, nhưng tôi cần để có được đầu ra để phù hợp với một định dạng nhất định bằng cách thêm một lớp. Tôi đã tìm ra một cách, nhưng hy vọng rằng sẽ có một cách dễ dàng hơn cách tôi đang làm.Có cách nào dễ dàng hơn để thêm một lớp trên một đối tượng JSON bằng cách sử dụng Mã hóa JSON Golang không?
Dưới đây là ví dụ về cách tôi đang thực hiện.
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
}
Tôi có nhiều cấu trúc được xác định mà tôi cần thực hiện, vì vậy tôi hy vọng sẽ có một giải pháp tốt hơn sẽ không cho phép tôi với hơn 100 dòng mã để chỉ thêm trình bao bọc xung quanh đối tượng JSON. Lý tưởng nhất là tôi muốn một cái gì đó có thể đạt được ở tên phần tử XML được định nghĩa cho bộ mã hóa XML và sử dụng nó để bọc JSON.
Trong trường hợp của tôi, tôi đang sử dụng các hàm MarshalJSON vì các cấu trúc này có thể được lồng vào nhau. Nếu nó giúp tôi luôn biết rằng cấu trúc truy vấn là cấu trúc gốc.
Điều này rất gần. Thật không may tôi có những tình huống các cấu trúc được lồng nhau. Vì vậy, một ví dụ đầu ra là '{" truy vấn ": {" truy vấn ": [{" thuật ngữ truy vấn ": {" văn bản ": [" dữ liệu "]}}]}}'. Đó là lý do tại sao tôi sử dụng các hàm MarshalJSON. – justdewit
@justdewit Xem câu trả lời đã sửa đổi. Hãy cho tôi biết nếu điều này giải quyết câu hỏi ban đầu của bạn chính xác hơn. – sberry
Cảm ơn bạn! Tốt hơn nhiều so với những gì tôi đang làm. – justdewit