提问人:T-time 提问时间:4/20/2023 更新时间:4/20/2023 访问量:64
JSON.stringify 返回空 - Google places API
JSON.stringify returns empty- Google places API
问:
我正在制作一个简单的 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() 函数作为回调,但它仍然不起作用。我不确定我的语法是错误的,还是我在这里完全错过了正确的方法。任何建议都很棒!
答: 暂无答案
评论