亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從未封送數據準備 json 對象

從未封送數據準備 json 對象

慕桂英3389331 2022-09-12 16:26:09
我有這樣的 json 數據:json: {"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}]}我使用type Products struct {    Product_id int    Price json.Number    Variant_id int}type Pdata struct {    Products []Products `json:"products"`}然后我使用解封jsonb := []byte(jsonVal)    var data Pdata    err := json.Unmarshal(jsonb, &data)    if err != nil {        fmt.Println(err)        return    }并獲得輸出,如{[{1 100 100} {2 100 0}]}現在我需要將這些數據轉換為如下所示的json對象{"purchased_products": [{"product_id": 1,"price": 1200,"variation_id": 100},{"product_id": 2,"price": 100,"variation_id": null}]}之后,我需要將其分配給“json”var d = map[string]string{    "json":        jsonVal,    "created_at":  time.Now().Format("2006-01-02 15:04:05"),    "updated_at":  time.Now().Format("2006-01-02 15:04:05"),}我該怎么做?
查看完整描述

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"),

    }

您可以在此處運行并查看完整代碼。


查看完整回答
反對 回復 2022-09-12
?
Smart貓小萌

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


查看完整回答
反對 回復 2022-09-12
?
眼眸繁星

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


查看完整回答
反對 回復 2022-09-12
?
當年話下

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)

    }

}


查看完整回答
反對 回復 2022-09-12
  • 4 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號