我有几个结构相同的 JSON。他们的对象是对象数组。如何将这些数组附加到一个数组中?
我想做的事:
我想向此 url 发送多个 get 请求:
https://catalog.wb.ru/brands/m/catalog?page=1&limit=300&brand=5786&dest=-1257786&sort=pricedown
然后收集“产品”对象内的所有数据。键“page”的值会自动递增以获取所有页面的数据。
实际上,我不太确定是否真的需要编写一个 json 来将其发送到前端。也许当我在 for 循环中收到新响应时发送不同的请求会更好?
我做了什么:
制作了正确的结构。通过单个请求,一切正常。
创建了 requestbodybytes []byte
和 productsbytes []byte
,以便将它们与 ioutil.readall
中的 []bytes
一起附加。
打印 requestbodybytes
的长度我发现它随着每个请求而扩展,但是在我解组它之后,我在输出中看到空结构。
我知道发生这种情况是因为每个请求我都会收到 type response
的新 json。但是,如果我需要由 type response
的多个 json 中的“产品”对象组成的 product structs
切片,该怎么办?
注意:需要在 for 循环内初始化 requestbodybytes
以使用它来停止发送请求,因为当页面上没有信息时,服务器会给出 200 代码和空 json。
提前谢谢您!
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)) }
正确答案
没有理由收集所有原始响应字节。只需单独解组每个响应并将每个页面的产品附加到包含所有产品的某个切片即可。另外,在循环中调用 defer resp.body.close()
可能不是您想要的。延迟语句仅在循环结束后执行,因此连接不能重新用于请求。将循环体提取到它自己的函数中使这变得更加清晰:
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 }
以上是我有几个结构相同的 JSON。他们的对象是对象数组。如何将这些数组附加到一个数组中?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

本文讨论了GO编程中的GO FMT命令,该命令将代码格式化以遵守官方样式准则。它突出了GO FMT在维持代码一致性,可读性和降低样式辩论方面的重要性。 FO的最佳实践

本文介绍在Debian系统下监控PostgreSQL数据库的多种方法和工具,助您全面掌握数据库性能监控。一、利用PostgreSQL内置监控视图PostgreSQL自身提供多个视图用于监控数据库活动:pg_stat_activity:实时展现数据库活动,包括连接、查询和事务等信息。pg_stat_replication:监控复制状态,尤其适用于流复制集群。pg_stat_database:提供数据库统计信息,例如数据库大小、事务提交/回滚次数等关键指标。二、借助日志分析工具pgBadg

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...
