Maison >développement back-end >Golang >J'ai plusieurs JSON avec la même structure. Leurs objets sont des tableaux d'objets. Comment puis-je ajouter ces tableaux dans un tableau ?
Ce que je veux faire :
Je souhaite envoyer plusieurs requêtes get à cette URL :
https://catalog.wb.ru/brands/m/catalog?page=1&limit=300&brand=5786&dest=-1257786&sort=pricedown
Collectez ensuite toutes les données à l’intérieur de l’objet « produit ». La valeur de la clé « page » est automatiquement incrémentée pour obtenir les données de toutes les pages.
En fait, je ne sais pas vraiment si j'ai vraiment besoin d'écrire un json pour l'envoyer au frontend. Peut-être serait-il préférable d'envoyer une requête différente lorsque je reçois une nouvelle réponse dans la boucle for ?
Ce que j'ai fait :
Fabriqué avec une structure correcte. Avec une seule demande, tout fonctionne bien.
Créés requestbodybytes []byte
和 productsbytes []byte
,以便将它们与 ioutil.readall
中的 []bytes
attachés ensemble.
En imprimant la longueur de requestbodybytes
, je vois qu'il s'étend à chaque requête, mais après l'avoir désorganisé, je vois des structures vides dans la sortie.
Je sais que cela se produit car à chaque demande que je reçois de type response
的新 json。但是,如果我需要由 type response
的多个 json 中的“产品”对象组成的 product structs
tranches, que dois-je faire ?
REMARQUE : Il faut initialiser requestbodybytes
à l'intérieur de la boucle for pour l'utiliser pour arrêter d'envoyer des requêtes car lorsqu'il n'y a aucune information sur la page le serveur donne un code 200 et un json vide.
Merci d'avance !
const URL = "https://catalog.wb.ru/brands/m/catalog?page=%d&limit=300&brand=5786&dest=-1257786&sort=pricedown" type Response struct { Data struct { Products []Product `json:"products"` } `json:"data"` } type Product struct { ID int `json:"id"` Name string `json:"name"` Price int `json:"priceU"` Rating float32 `json:"reviewRating"` Sale int `json:"sale"` New bool `json:"isNew"` } func main() { var response Response var products Response //Also tried to make it []Response var ProductsBytes []byte for i := 1; ; i++ { resp, err := http.Get(fmt.Sprintf(URL, i)) if err != nil { fmt.Printf("#1 Error: %s", err) } defer resp.Body.Close() bytes, err := ioutil.ReadAll(resp.Body) var requestBodyBytes []byte requestBodyBytes = append(requestBodyBytes, bytes...) ProductsBytes = append(ProductsBytes, bytes...) json.Unmarshal(requestBodyBytes, &response) fmt.Println(resp.Status) fmt.Printf("\nSlice from page #%d\nLength of bytes: %d\n", i, len(bytes)) fmt.Printf("Length of finalResult: %d\n", len(requestBodyBytes)) if len(response.Data.Products) == 0 { fmt.Println("There's no more data") break } } json.Unmarshal(ProductsBytes, &products) fmt.Println(response) fmt.Println(products) fmt.Println(len(products)) }
Il n'y a aucune raison de collecter tous les octets de réponse brute. Décomposez simplement chaque réponse individuellement et ajoutez les produits de chaque page à une tranche contenant tous les produits. De plus, appeler defer resp.body.close()
dans une boucle n'est probablement pas ce que vous voulez. Les instructions différées ne sont exécutées qu'après la fin de la boucle, la connexion ne peut donc pas être réutilisée pour les requêtes. Extraire le corps de la boucle dans sa propre fonction rend cela plus clair :
package main import ( "encoding/json" "errors" "fmt" "log" "net/http" ) const URL = "https://catalog.wb.ru/brands/m/catalog?page=%d&limit=300&brand=5786&dest=-1257786&sort=pricedown" type Response struct { Data struct { Products []Product `json:"products"` } `json:"data"` } type Product struct { ID int `json:"id"` Name string `json:"name"` Price int `json:"priceU"` Rating float32 `json:"reviewRating"` Sale int `json:"sale"` New bool `json:"isNew"` } func main() { var allProducts []Product for i := 1; ; i++ { page, err := fetchPage(i) if err != nil { log.Fatal(err) // TODO } allProducts = append(allProducts, page...) if len(page) == 0 { break } } fmt.Println(allProducts) fmt.Println(len(allProducts)) } func fetchPage(i int) ([]Product, error) { resp, err := http.Get(fmt.Sprintf(URL, i)) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != 200 { return nil, errors.New(resp.Status) } var response Response err = json.NewDecoder(resp.Body).Decode(&response) if err != nil { return nil, err } return response.Data.Products, nil }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!