JSON.stringify 返回空 - Google places API

JSON.stringify returns empty- Google places API

提问人:T-time 提问时间:4/20/2023 更新时间:4/20/2023 访问量:64

问:

我正在制作一个简单的 Web 仪表板,您可以在其中查询地点的不同关键字,将它们添加到列表中,并使用 Google Places API 将它们下载为 json。我在最后一步遇到了障碍,我想使用 JSON.stringify 将收集的数据从对象转换为 json 字符串并让用户下载它。

我设置它,首先您使用 nearbySearch() 方法将位置 ID 添加到全局列表中。当您准备好下载时,点击下载按钮,这将启动对位置详细信息的第二个查询,将它们添加到 js 对象,将其转换为 json 字符串,并将其下载为文件。

let placeData = {places:[
        {name: 'place name', 
        price_level: 'price level: 0-no data, 1-4 rating',
        rating: 'user rating 1-5',
        user_ratings_total: 'number of user ratings'
    }
]}

function requestDetails(myCallback){

    for(const id of placeIDs){
        setTimeout(sendRequest(id),100)
    }
        myCallback(placeData);
}

function sendRequest(id){
    var request = {
        placeId: id,
        //fields: ['name'],
        fields: ['name', 'price_level', 'rating', 'reviews', 'user_ratings_total']
      };
      
      detService = new google.maps.places.PlacesService(map);
      detService.getDetails(request, detCallback);
      
      function detCallback(place, status) {
        if (status == google.maps.places.PlacesServiceStatus.OK) {
          pushData(place);
        }
      }
}

function pushData(place){

    let priceLevel;
    let rating;
    let reviews;
    let userRatings;

    if(place.price_level== undefined){priceLevel= 0}
    else{priceLevel=place.price_level}
    if(place.rating== undefined){rating= 0}
    else{rating=place.rating}
    if(place.reviews== undefined){reviews= 'no data'}
    else{reviews=place.reviews}
    if(place.user_ratings_total== undefined){userRatings= 0}
    else{userRatings=place.user_ratings_total}

    placeData.places.push({
        name: place.name.toString(), 
        price_level: parseInt(priceLevel),
        rating: parseInt(rating),
        user_ratings_total: parseInt(userRatings)
    })
}

function download(content, fileName, contentType) {
    const a = document.createElement("a");
    const file = new Blob([content], { type: contentType });
    a.href = URL.createObjectURL(file);
    a.download = fileName;
    a.click();
  }

  function onDownload(data){
      download(JSON.stringify(data), "myfile.json", "text/plain");
  }

按钮的 HTML 设置如下:<button class="button" id="download" onclick="requestDetails(onDownload)">Download</button>

我必须设置超时的 sendRequest() 方法,因为 places API 允许您一次进行 10 次调用,这是一个快速修复。我排除了由于数据格式错误而未写入 json 的可能性,如果将 json 插入与 pushData() 相同的位置,则我给它的任何变量的文件都是空的。

如果我在将对象转换为字符串之前打印出对象,它看起来像这样;

{places: Array(1)}
places
: 
Array(11)
0
: 
{name: 'place name', price_level: 'price level: 0-no data, 1-4 rating', rating: 'user rating 1-5', user_ratings_total: 'number of user ratings'}
1
: 
{name: 'Bolaka Avoin yhtiö', price_level: 0, rating: 0, user_ratings_total: 0}
2
: 
{name: 'RAYAN Pizza Kebab', price_level: 1, rating: 3, user_ratings_total: 99}
3
: 
{name: 'Döner king', price_level: 0, rating: 3, user_ratings_total: 165}
4
: 
{name: 'Ravintola Ilano', price_level: 0, rating: 4, user_ratings_total: 117}
5
: 
{name: 'Yu Zi Ravintola', price_level: 0, rating: 4, user_ratings_total: 13}
6
: 
{name: 'Ravintola Wenla', price_level: 0, rating: 3, user_ratings_total: 28}
7
: 
{name: 'Shishkebab Helsinki Kontula', price_level: 1, rating: 4, user_ratings_total: 436}
8
: 
{name: 'Hesburger Helsinki Kontula', price_level: 2, rating: 3, user_ratings_total: 701}
9
: 
{name: 'Subway', price_level: 2, rating: 4, user_ratings_total: 279}
10
: 
{name: 'Kalkan Pizza-Kebab-Grilli (Entinen Pizzataxi Kontula)', price_level: 1, rating: 4, user_ratings_total: 249}
length
: 
11
[[Prototype]]
: 
Array(0)
[[Prototype]]
: 
Object

因此,它们以某种方式被写入,但在最顶层,它将数组注册为只有一个项目,即创建对象时使用的信息项目。但是,打开它后,它显示数组中有 11 个项目及其数据。

当我转换为字符串时,我只看到第一项;

{"places":[{"name":"place name","price_level":"price level: 0-no data, 1-4 rating","rating":"user rating 1-5","user_ratings_total":"number of user ratings"}]}

我猜超时会阻止在我打印数据之前写入数据,所以我尝试将 onDownload() 函数作为回调,但它仍然不起作用。我不确定我的语法是错误的,还是我在这里完全错过了正确的方法。任何建议都很棒!

javascript json 回调 google-places-api

评论


答: 暂无答案