Beklenmeyen JSON biçimindeki verileri numaraya ayrıştırma Go / Golang sunucusundan React getirme

0

Soru

Bir React uygulamasına veri sunmak için bir Go sunucusu kullanan bir web uygulaması oluşturuyorum.

Sunucumun yapımında, Go docs tarafından sağlanan öğreticiyi takip ettim (https://golang.org/doc/tutorial/web-service-gin). Kodum bu koda çok benziyor ve curl kullandığımda beklenen sonuçları alıyorum.

[
  {
    "id":0,
    "date":"2021-11-21T12:00:00Z",
    "rentedTo":"Bob",
    "rentedBy":"Jim"
  },
  //etc...

Ancak React'in getirme API'sini kullandığımda sonuçlarım beklenmedik bir biçimde geri geliyor.

fetch('http://localhost:8080/rentals')
.then((response)=> {
  if (response.ok) {
    return response.json();
  }
  throw response;
.then((jsonArr) => {
  handleRentalsData(jsonArr)
  })
.catch((error) => {
  console.error("Error fetching data: ", error);
});

ne zaman ben... console.log(jsonArr), tarayıcı aşağıdakileri bildirir:

Array(3) [ {...},{...},{...} ]
//Expanding this object via the console shows the following information:
---> 0: Object { id: 0, date: "2021-11-21T12:00:00Z", rentedTo: "Bob", ... } 
---> 1: Object { id: 1, date: "2021-11-22T12:00:00Z", rentedTo: "Bob", ... }
---> 2: Object { id: 2, date: "2021-11-23T12:00:00Z", rentedTo: "Bob", ... }

Bu indeksler (ve tarayıcının etiketi) verilerin artık bir Dizi şeklinde olduğunu gösteriyordu, ben de öyle davrandım.

İçindeki json dizelerini ayrıştırmak için bu dizide döngü yapmaya çalıştım, ancak JSON.parse(data) beklediğim gibi nesneler üretmek yerine yalnızca sayılar (sırasıyla 0, 1 ve 2) üretir.

for (const json in jsonArr){
  console.log(typeof json);            //string
  const rentalObj = JSON.parse(json);
  console.log(typeof rentalObj);       //number
  console.log(rentalObj);              //0, 1, and 2 respectively
  console.log(rentalObj.date);         //undefined, because rentalObj is now a number.
}

Biraz arama yaptım ve verilerin geldiği dizinin dizinlerinin bir soruna neden olabileceğini duydum, bu yüzden de bir reviver işleviyle ayrıştırmaya çalıştım.

for (const json in jsonArr){
  console.log(typeof json);            //string
  const rentalObj = JSON.parse(json, (key, value) => {
    console.log(key);                  //<empty string>
    console.log(value);                //0, 1, and 2
    return(value);
  });
  console.log(typeof rentalObj);       //number
  console.log(rentalObj);              //0, 1, and 2 respectively
  console.log(rentalObj.date);         //undefined
}

Çalışan JSON.parse(jsonArr) beklendiği gibi bir hata atar. Kafam allak bullak oldu. Neden bir (n dizin) numarasına ayrıştırılıyor? Dizinin içindeki dizeleri ayrıştırırken (veya yazdırırken) yalnızca sayı üretirken Dizinin içindeki Nesneleri nasıl ayıklayabilirim?

fetch-api go javascript json
2021-11-23 04:47:53
1

En iyi cevabı

1

Bu json değer for (const json in jsonArr) { "numaralandırılabilir özellikler" olarak ayarlanacaktır. jsonArr Bu durumda dizinler olan dizi.

for (const x in ['foo','bar','baz']) { console.log(x) };
// output:
// 0
// 1
// 2

Yani muhtemelen kullanmak istemiyorsun for ... in. Bunun yerine kullanabilirsiniz for ... of dizinin öğeleri üzerinde yineleme yapmak için:

for (const x of ['foo','bar','baz']) { console.log(x) };
// output:
// foo
// bar
// baz

Dizi yineleme ve for ... in:

Not: for...in dizin sırasının önemli olduğu bir Dizi üzerinde yineleme yapmak için kullanılmamalıdır.

Dizi dizinleri yalnızca tamsayı adlarıyla numaralandırılabilir özelliklerdir ve aksi takdirde, genel nesne özellikleriyle aynıdır. Hiç yok... bunu garanti et for...in herhangi bir özel dizin döndürür sipariş. Bu for...in döngü deyimi tüm numaralandırılabilir döndürür tamsayı olmayan adlara sahip olanlar ve olanlar da dahil olmak üzere özellikler kalıtımsal.

Yineleme sırası uygulamaya bağlı olduğundan, yineleme bir dizi üzerinde öğeleri tutarlı bir sırada ziyaret etmeyebilir. Bu nedenle, kullanmak daha iyidirfor sayısal dizin içeren döngü (veya Array.prototype.forEach() ya dafor...of döngü) üzerinde yineleme yaparken erişim sırasının önemli olduğu diziler.

2021-11-23 05:47:08

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................