Json кодирование с golang - PullRequest
       0

Json кодирование с golang

0 голосов
/ 14 марта 2020
resp, err := http.Get(url + t.Keywords[0] + ".json")
if err != nil {
    fmt.Println("error while getting productsRaw")
}
productsRaw, err := ioutil.ReadAll(resp.Body)
if err != nil {
    fmt.Println("error while parsing body")
}
productsRawString := string(productsRaw)
productsData := ShopifyProducts{}
json.Unmarshal([]byte(productsRawString), &productsData)
fmt.Println(productsData.Products)\

это мой код для кодирования json файла с веб-сайта, и он работает, если он кодирует более одного продукта

{"product":{"id":4420737073222,"title":"W AIR MAX VERONA","body_html":"\u003cp\u003e\u003cspan\u003eDesigned with every woman in mind, the mixed-material upper features a plush collar, flashy colours and unique stitching patterns. Nike Air cushioning combines with the lifted foam heel for a modern touch, adding comfort and style to your journey.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003e-Smooth 

, например, это то, что показывают Println (productsRawString), поэтому URL работает , но json .Unmarshal ([] byte (productsRawString), & productsData) не работает.

type ShopifyProducts struct {
Products []struct {
    BodyHTML  string `json:"body_html"`
    CreatedAt string `json:"created_at"`
    Handle    string `json:"handle"`
    ID        int    `json:"id"`
    Images    []struct {
        CreatedAt  string        `json:"created_at"`
        Height     int           `json:"height"`
        ID         int           `json:"id"`
        Position   int           `json:"position"`
        ProductID  int           `json:"product_id"`
        Src        string        `json:"src"`
        UpdatedAt  string        `json:"updated_at"`
        VariantIds []interface{} `json:"variant_ids"`
        Width      int           `json:"width"`
    } `json:"images"`

Структура ShopifyProducts.

В чем проблема с Unmarshal?

1 Ответ

2 голосов
/ 14 марта 2020

Как я вижу в вашем ShopifyProducts struct вы объявили Products как array. Но в вашей сериализованной строке product - это object. Таким образом, он не может демонтировать эту необработанную строку.

Вы также заявляете, что она работает, если продукта больше, чем один. Его рабочий продукт в вашей структуре - это массив.

Возможные решения:

  • Предварительно обработайте необработанную строку и свяжите ваш продукт в массив, когда он еще не является массивом. Таким образом, вы сможете распаковать его обычным способом. Но это будет обходной путь, когда вам нужно будет написать ненужный код предварительной обработки.
  • Просто измените данные, откуда вы их получаете. Всегда сохраняйте продукт в виде массива, это позволит вам выполнить вызов GET с конечной точки, и он всегда будет иметь общий формат.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...