ホームページ  >  記事  >  バックエンド開発  >  同じ構造の JSON がいくつかあります。それらのオブジェクトはオブジェクトの配列です。これらの配列を配列に追加するにはどうすればよいですか?

同じ構造の JSON がいくつかあります。それらのオブジェクトはオブジェクトの配列です。これらの配列を配列に追加するにはどうすればよいですか?

WBOY
WBOY転載
2024-02-08 20:57:11930ブラウズ

我有几个结构相同的 JSON。他们的对象是对象数组。如何将这些数组附加到一个数组中?

質問内容

やりたいこと:

この URL に複数の get リクエストを送信したいです: https://catalog.wb.ru/brands/m/catalog?page=1&limit=300&brand=5786&dest=-1257786&sort=pricedown 次に、「product」オブジェクト内のすべてのデータを収集します。すべてのページのデータを取得するために、キー「page」の値が自動的にインクリメントされます。

実際には、フロントエンドに送信するために json を記述する必要があるかどうかはよくわかりません。 for ループで新しい応答を受け取ったら、別の要求を送信したほうがよいでしょうか?

私が何をしたのか:

正しい構造を作りました。 1 つのリクエストですべてが正常に動作します。

requestbodybytes []byteproductsbytes []byte を作成して、 ioutil.readall[]bytes## と結合できるようにしました。 # 一緒に追加します。 requestbodybytes の長さを出力すると、リクエストごとに拡張されることがわかりますが、アンマーシャリングすると出力に空の構造が表示されます。

リクエストごとに

type レスポンス の新しい json を受信するので、これが起こっていることはわかります。しかし、複数の json 内の type response 'product' オブジェクトで構成される product structs のスライスが必要な場合はどうすればよいでしょうか?

注: ページに情報がない場合、サーバーは 200 コードと空の JSON を与えるため、リクエストの送信を停止するために使用するには、for ループ内で

requestbodybytes を初期化する必要があります。 ###よろしくお願いします!

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

を呼び出すことは、望ましくない可能性があります。遅延ステートメントはループ終了後にのみ実行されるため、接続をリクエストに再利用することはできません。ループ本体を独自の関数に抽出すると、これがより明確になります: リーリー

以上が同じ構造の JSON がいくつかあります。それらのオブジェクトはオブジェクトの配列です。これらの配列を配列に追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。