Разобрать строковый JSON

Я пытаюсь разобрать строковый JSON с помощью Go, но не могу найти ничего, что объясняет, как сделать эффективный синтаксический анализ.

Пример 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.Unmarshal(body, &j)

Inian 25.12.2020 17:23

Пример кода JSON и Go недействителен. Отредактируйте вопрос, чтобы показать минимально воспроизводимый пример . Вот отправная точка play.golang.org/p/j6bk5Q_P9yw

Charlie Tumahai 25.12.2020 17:24

Что такое «строчный» JSON?

Ulrich Eckhardt 25.12.2020 17:24

«строковый JSON» является избыточным. Весь JSON является строкой. Другого варианта нет.

Jonathan Hall 25.12.2020 18:00
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
4
4
188
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагая, что добавленный вами 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)
}

Это только демаршалинг первого слоя, я хочу получить доступ к базовому JSON.

Luffy 25.12.2020 18:14
Ответ принят как подходящий

сделать это в два шага.

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)
}

Другие вопросы по теме