解析字符串化 JSON

Parse stringified JSON

我正在尝试使用 Go 解析字符串化 JSON,但我找不到任何解释如何进行高效解析的内容。

示例JSON:

{
 "messages":"<ul class=\"messages\"><li class=\"success-msg\"><ul><li><span>Item succcessfully added<\/span><\/li><\/ul><\/li><\/ul>",
 "app_cart":"[]",
 "addcartrows":"[{\"productId\":\"1675688\",\"quantity\":1,\"unitPrice\":\"290.00\",\"currency\":\"EUR\",\"sku\":\"P00525485-3\"}]",
 "minicart_content":"<ul class=\"checkout-types minicart\">\n
<li>",
 "cart_qty":"1",
 "added_product_json":"{\"id\":\"1675695\",\"size\":\"40\"}"
}

我通常通过将其转换为结构来解析 json。像这样:

type AutoGenerated struct {
    Messages         string `json:"messages"`
    AppCart          string `json:"app_cart"`
    Addcartrows      string `json:"addcartrows"`
    MinicartContent  string `json:"minicart_content"`
    CartQty          string `json:"cart_qty"`
    AddedProductJSON string `json:"added_product_json"`
}
var j AutoGenerated 

if err = json.Unmarshal(body, &AutoGenerated); err != nil {
    fmt.Println(err) // json: cannot unmarshal string into Go struct field AutoGenerated.added_product_json
}

但是我不知道如何正确解析这种类型的响应。 有帮助吗?

假设您添加的 json 的值 "minicart_content" 存在格式问题,下面应该有所帮助 -

package main

import (
    "fmt"
    "encoding/json"
)

var myjson string = `{
    "messages": "<ul class=\"messages\"><li class=\"success-msg\"><ul><li><span>Item succcessfully added<\/span><\/li><\/ul><\/li><\/ul>",
    "app_cart": "[]",
    "addcartrows": "[{\"productId\":\"1675688\",\"quantity\":1,\"unitPrice\":\"290.00\",\"currency\":\"EUR\",\"sku\":\"P00525485-3\"}]",
    "minicart_content": "<ul class=\"checkout-types minicart\">\n <li > ",
    "cart_qty": "1",
    "added_product_json": "{\"id\":\"1675695\",\"size\":\"40\"}"
}`

type AutoGenerated struct {
    Messages         string `json:"messages"`
    AppCart          string `json:"app_cart"`
    Addcartrows      string `json:"addcartrows"`
    MinicartContent  string `json:"minicart_content"`
    CartQty          string `json:"cart_qty"`
    AddedProductJSON string `json:"added_product_json"`
}

func main() {

    var j AutoGenerated
    if err := json.Unmarshal([]byte(myjson), &j); err != nil {
        fmt.Println(err)
    }
    fmt.Println(j.AddedProductJSON)
}

分两步完成。

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    type AutoGenerated struct {
        Messages         string `json:"messages"`
        AppCart          string `json:"app_cart"`
        Addcartrows      string `json:"addcartrows"`
        MinicartContent  string `json:"minicart_content"`
        CartQty          string `json:"cart_qty"`
        AddedProductJSON string `json:"added_product_json"`
    }
    type addedProduct struct {
        ID   string `json:"id"`
        Size string `json:"size"`
    }
    type productRow struct {
        ProductID string `json:"productId"`
        Quantity  int    `json:"quantity"`
        UnitPrice string `json:"unitPrice"`
        Currency  string `json:"currency"`
        SKU       string `json:"sku"`
    }
    var j AutoGenerated

    body := []byte(`{
 "messages":"<ul class=\"messages\"><li class=\"success-msg\"><ul><li><span>Item succcessfully added<\/span><\/li><\/ul><\/li><\/ul>",
 "app_cart":"[]",
 "addcartrows":"[{\"productId\":\"1675688\",\"quantity\":1,\"unitPrice\":\"290.00\",\"currency\":\"EUR\",\"sku\":\"P00525485-3\"}]",
 "minicart_content":"<ul class=\"checkout-types minicart\">\n<li>",
 "cart_qty":"1",
 "added_product_json":"{\"id\":\"1675695\",\"size\":\"40\"}"
}`)

    if err := json.Unmarshal(body, &j); err != nil {
        panic(err)
    }

    var k []productRow
    if err := json.Unmarshal([]byte(j.Addcartrows), &k); err != nil {
        panic(err)
    }

    var u addedProduct
    if err := json.Unmarshal([]byte(j.AddedProductJSON), &u); err != nil {
        panic(err)
    }
    fmt.Printf("%#v\n\n", j)
    fmt.Printf("%#v\n\n", k)
    fmt.Printf("%#v\n\n", u)
}