4 回答

TA貢獻2065條經驗 獲得超14個贊
創建一個類型(例如:購買的產品),如下所示。
type PurchasedProducts struct {
Products []Products `json:"purchased_products"`
}
初始化“已購買產品”類型變量,并將未密封的產品分配給“已購買的產品”,如下所示。
pProducts := PurchasedProducts{Products: data.Products}
jsonByte, err := json.Marshal(pProducts)
if err != nil {
fmt.Println(err)
return
}
然后將該數組轉換為字符串,并將其分配給地圖,如下所示。[]byte
var d = map[string]string{
"json": string(jsonByte),
"created_at": time.Now().Format("2006-01-02 15:04:05"),
"updated_at": time.Now().Format("2006-01-02 15:04:05"),
}
您可以在此處運行并查看完整代碼。

TA貢獻1911條經驗 獲得超7個贊
只需再定義兩個結構來模擬第二個 JSON 對象:
type Pdata2 struct {
PurchasedProducts []Product2
}
type Product2 struct {
Product_id int
Price json.Number
Variation_id *int // pointer to int
}
該字段是一種類型,因為所需的輸出 JSON 顯示 。如果將字段聲明為簡單字段,則其零值將被封送至 。Variation_id*int"variation_id": nullint0
然后使用前面結構中的值初始化這些結構:
func main() {
data2 := Pdata2{
PurchasedProducts: make([]Product2, len(data.Products)),
}
for i, p := range data.Products {
data2.PurchasedProducts[i] = Product2{
Product_id: p.Product_id,
Price: p.Price,
Variation_id: nullableInt(p.Variant_id),
}
}
b, err := json.Marshal(data2)
if err != nil {
// ... handle error
}
var d = map[string]string{
"json": string(b),
// ...
}
fmt.Println(d)
}
func nullableInt(n int) *int {
if n == 0 {
return nil
}
return &n
}
游樂場: https://play.golang.org/p/xhsmHNBjRKN

TA貢獻1873條經驗 獲得超9個贊
對于可為 null 的字段,您可以使用指針,例如,如果 json 字段可以是整數或 json ,并且您希望保留該信息,則可以更改為 。variant_idnullVariant_id intVariant_id *int
type Product struct {
Product_id int `json:"product_id"`
Price json.Number `json:"price"`
Variant_id *int `json:"variant_id"`
}
要在取消封送和封送之間更改 json 字段名稱,您可以聲明第二個結構,其字段與原始字段相同,但具有定義所需字段名稱的結構標記,那么,如果結構在所有其他方面等效,則可以在它們之間進行轉換。Products
type Product struct {
Product_id int `json:"product_id"`
Price json.Number `json:"price"`
Variant_id int `json:"variant_id"`
}
type PurchasedProduct struct {
Product_id int `json:"product_id"`
Price json.Number `json:"price"`
Variant_id int `json:"variation_id"` // here variant_id becomes variation_id
}
然后,如果 是 類型 ,您可以簡單地將其轉換為如下所示:pProductPurchasedProduct
pp := PurchasedProduct(p)
要將轉換卸載到封送處理過程,可以讓原始類型實現接口并在那里執行轉換。json.Marshaler
func (p Product) MarshalJSON() ([]byte, error) {
type P struct {
Product_id int `json:"product_id"`
Price json.Number `json:"price"`
Variant_id *int `json:"variation_id"`
}
return json.Marshal(P(p))
}
通過上述操作,您可以執行以下操作:
func main() {
// unmarshal
var pd Pdata
err := json.Unmarshal(data, &pd)
if err != nil {
panic(err)
}
// marshal
out, err := json.MarshalIndent(pd, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
https://play.golang.org/p/0gnrjgUslza

TA貢獻1890條經驗 獲得超9個贊
給你。假設是:
產品是一個可能更復雜的模型,因此它具有專用的結構。因此,從產品到輸出產品的轉換可以單獨進行單元測試。
它是一次性使用應用程序,而不是公開 API 的應用程序的一部分。否則,應將其適當地分成幾層,并將輸出編寫為結構。
package main
import (
"encoding/json"
"log"
"os"
"time"
)
type (
Product struct {
ProductID int `json:"product_id"`
VariantID int `json:"variant_id"`
Price json.Number
}
Products []Product
OutputProduct struct {
ProductID int `json:"product_id"`
VariantID int `json:"variation_id"`
Price json.Number
}
)
func (p Product) ToOutputProduct() OutputProduct {
return OutputProduct{
ProductID: p.ProductID,
VariantID: p.VariantID,
Price: p.Price,
}
}
func (p Products) ToOutputProducts() []OutputProduct {
outputProducts := make([]OutputProduct, len(p))
for i := 0; i < len(p); i++ {
outputProducts[i] = p[i].ToOutputProduct()
}
return outputProducts
}
func main() {
var inputJSON = `{"opt1":200,"opt3":"1","opt4":"13","opt5":null,"products":[{"product_id":1,"price":100,"variant_id":100},{"product_id":1,"price":100,"variant_id":null}]}`
var parsedInput struct {
Products Products
}
if err := json.Unmarshal([]byte(inputJSON), &parsedInput); err != nil {
log.Fatal(err)
}
var output = map[string]interface{}{
"json": map[string][]OutputProduct{
"purchased_products": parsedInput.Products.ToOutputProducts(),
},
"created_at": time.Now().Format("2006-01-02 15:04:05"),
"updated_at": time.Now().Format("2006-01-02 15:04:05"),
}
encoder := json.NewEncoder(os.Stdout)
encoder.SetIndent(" ", " ")
if err := encoder.Encode(output); err != nil {
log.Fatal(err)
}
}
添加回答
舉報