【问题标题】:How to remove unwanted characters (brackets, quotes, and commas) from a JSON string?如何从 JSON 字符串中删除不需要的字符(括号、引号和逗号)?
【发布时间】:2021-06-07 16:52:37
【问题描述】:

See here for a working example of my Google Sheet

See here to access my Google App Script for the Google Sheet


我一直在从事一个项目,该项目将能够在谷歌地图上输入一个地点的名称,然后使用 Places API 和地点详细信息来提取相关信息。

我提取的一点信息是营业时间,称为place.weekday_text,看起来像这样:

"[

 "Monday: 2:00 – 10:00 PM",

 "Tuesday: 2:00 – 10:00 PM",

 "Wednesday: 2:00 – 10:00 PM",

 "Thursday: 2:00 – 10:00 PM",

 "Friday: 12:00 – 11:00 PM",

 "Saturday: 12:00 – 11:00 PM",

 "Sunday: 12:00 – 9:00 PM"

]"

我尝试在字符串化的末尾使用替换:

JSON.stringify(place.opening_hours.weekday_text, "", 1).replace("[", "").replace("\"", "").replace("\",", "").replace("]", "")

但这最多只能照顾星期一。

有没有办法删除多余的括号、逗号和引号,以便返回一个漂亮整洁的版本,看起来像这样?

Saturday    12PM–12AM
Sunday  12–8PM
Monday  Closed
Tuesday Closed
Wednesday   3–11PM
Thursday    3–11PM
Friday  3PM–12AM

这是我的代码的相关部分:

//Gets the Place ID
function COMBINED(text) {
  var API_KEY = 'AIzxxxxxxxxxxxxxxxxxxxxxxxxx';
  var baseUrl = 'https://maps.googleapis.com/maps/api/place/findplacefromtext/json';
  var queryUrl = baseUrl + '?input=' + text + '&inputtype=textquery&key=' + API_KEY + "&locationbias=point:" + LOC_BASIS_LAT_LON;
  var response = UrlFetchApp.fetch(queryUrl);
  var json = response.getContentText();
  var placeId = JSON.parse(json);
  var ID = placeId.candidates[0].place_id;

  var fields = 'name,formatted_address,formatted_phone_number,website,url,types,opening_hours';
  var baseUrl2 = 'https://maps.googleapis.com/maps/api/place/details/json?placeid=';
  var queryUrl2 = baseUrl2 + ID + '&fields=' + fields + '&key='+ API_KEY + "&locationbias=point:" + LOC_BASIS_LAT_LON;

  if (ID == '') {
    return 'Give me a Google Places URL...';
  }

  var response2 = UrlFetchApp.fetch(queryUrl2);
  var json2 = response2.getContentText();
  var place = JSON.parse(json2).result;


  return [[ place.name,
            place.formatted_address,
            place.formatted_phone_number,
            place.website,
            place.url,
            //JSON.stringify(place.opening_hours.weekday_text, "", 1).replace("[", "").replace("\"", "").replace("\",", "").replace("]", ""),
          ]];
}

如果我们在 Google 表格上输入“Big Alice Brewing”并转到生成的网页,您会看到以下内容

https://maps.googleapis.com/maps/api/place/details/json?placeid=ChIJh9-J99hYwokRxc9AgwkG1Io&fields=name,formatted_address,formatted_phone_number,website,url,types,opening_hours&key=AIzaSyD1FOrIRLbO9mV4zbh6df0os6ZCeaGKlrE&locationbias=point:40.754734421655655,%20-73.98840133506883

{
   "html_attributions" : [],
   "result" : {
      "formatted_address" : "8-08 43rd Rd, Long Island City, NY 11101, USA",
      "formatted_phone_number" : "(347) 688-2337",
      "name" : "Big aLICe Brewing",
      "opening_hours" : {
         "open_now" : false,
         "periods" : [
            {
               "close" : {
                  "day" : 0,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 0,
                  "time" : "1200"
               }
            },
            {
               "close" : {
                  "day" : 1,
                  "time" : "2100"
               },
               "open" : {
                  "day" : 1,
                  "time" : "1600"
               }
            },
            {
               "close" : {
                  "day" : 2,
                  "time" : "2100"
               },
               "open" : {
                  "day" : 2,
                  "time" : "1600"
               }
            },
            {
               "close" : {
                  "day" : 3,
                  "time" : "2100"
               },
               "open" : {
                  "day" : 3,
                  "time" : "1600"
               }
            },
            {
               "close" : {
                  "day" : 4,
                  "time" : "2100"
               },
               "open" : {
                  "day" : 4,
                  "time" : "1600"
               }
            },
            {
               "close" : {
                  "day" : 5,
                  "time" : "2200"
               },
               "open" : {
                  "day" : 5,
                  "time" : "1200"
               }
            },
            {
               "close" : {
                  "day" : 6,
                  "time" : "2200"
               },
               "open" : {
                  "day" : 6,
                  "time" : "1200"
               }
            }
         ],
         "weekday_text" : [
            "Monday: 4:00 – 9:00 PM",
            "Tuesday: 4:00 – 9:00 PM",
            "Wednesday: 4:00 – 9:00 PM",
            "Thursday: 4:00 – 9:00 PM",
            "Friday: 12:00 – 10:00 PM",
            "Saturday: 12:00 – 10:00 PM",
            "Sunday: 12:00 – 8:00 PM"
         ]
      },
      "types" : [ "food", "point_of_interest", "establishment" ],
      "url" : "https://maps.google.com/?cid=10003627310223249349",
      "website" : "http://bigalicebrewing.com/"
   },
   "status" : "OK"
}

更新的代码仍然需要帮助:

  var response2 = UrlFetchApp.fetch(queryUrl2);
  var json2 = response2.getContentText();
  var place = JSON.parse(json2).result;

  var placeName = place.name;
  var placeAddress = place.formatted_address;
  var placePhoneNumber = place.formatted_phone_number;
  var placeWebsite = place.website;
  var placeURL = place.url;

  var weekdayTextList = place.opening_hours.weekday_text;
  weekdayTextList.forEach((weekdayText) => {
  console.log( weekdayText );
} );



  return [[ placeName,
            placeAddress,
            placePhoneNumber,
            placeWebsite,
            placeURL
          ]];

最终更新:这是最后一点帮助之后的工作代码。

function writeToSpreadsheet() {
  var results = COMBINED2('');
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1, 1, 1, 6).setValues(results);
}


function COMBINED2(text) {
  var API_KEY = 'AIzcxxxxxxxxxxxxxxxxxxxxxxxxx';
  var baseUrl = 'https://maps.googleapis.com/maps/api/place/findplacefromtext/json';
  var queryUrl = baseUrl + '?input=' + text + '&inputtype=textquery&key=' + API_KEY + "&locationbias=point:" + LOC_BASIS_LAT_LON;
  var response = UrlFetchApp.fetch(queryUrl);
  var json = response.getContentText();
  var placeId = JSON.parse(json);
  var ID = placeId.candidates[0].place_id;

  var fields = 'name,formatted_address,formatted_phone_number,website,url,types,opening_hours';
  var baseUrl2 = 'https://maps.googleapis.com/maps/api/place/details/json?placeid=';
  var queryUrl2 = baseUrl2 + ID + '&fields=' + fields + '&key='+ API_KEY + "&locationbias=point:" + LOC_BASIS_LAT_LON;

  if (ID == '') {
    return 'Give me a Google Places URL...';
  }

  var response2 = UrlFetchApp.fetch(queryUrl2);
  var json2 = response2.getContentText();
  var place = JSON.parse(json2).result;

  var placeName = place.name;
  var placeAddress = place.formatted_address;
  var placePhoneNumber = place.formatted_phone_number;
  var placeWebsite = place.website;
  var placeURL = place.url;

  var weekdays = '';
  place.opening_hours.weekday_text.forEach((weekdayText) => {
    weekdays += ( weekdayText + '\r\n' );
  } );

  var data = [ [
    place.name,
    place.formatted_address,
    place.formatted_phone_number,
    place.website,
    place.url,
    weekdays.trim()
  ] ];

  return data;
}

【问题讨论】:

    标签: json google-apps-script google-sheets


    【解决方案1】:

    您已经将 JSON 数据保存在字符串中,因此您需要将其解析为 JavaScript 对象(在您的情况下为数组):

    JSON.parse(jsonString)
    

    这将为您提供一个可以迭代的数据结构,以干净的方式提取每个项目。

    这是一个演示:

    var jsonString = '[ "Monday: 2:00 – 10:00 PM", "Tuesday: 2:00 – 10:00 PM", "Wednesday: 2:00 – 10:00 PM", "Thursday: 2:00 – 10:00 PM", "Friday: 12:00 – 11:00 PM", "Saturday: 12:00 – 11:00 PM", "Sunday: 12:00 – 9:00 PM" ]';
    
    var businessHours = JSON.parse(jsonString);
    
    businessHours.forEach((bizDay) => {
      console.log( bizDay );
    } );

    在我的情况下,我只是将每个单独的条目记录到控制台 - 当然,您可以将每个条目写入您的工作表。


    更新

    我查看了cmets中提到的以下代码片段:

    var response2 = UrlFetchApp.fetch(queryUrl2);
    var json2 = response2.getContentText();
    var place = JSON.parse(json2).result;
    
    
    return [[ place.name,
              place.formatted_address,
              place.formatted_phone_number,
              place.website,
              place.url,
              JSON.stringify(place.opening_hours.weekday_text, "", 1).replace("[", "").replace("\"", "").replace("\",", "").replace("]", ""),
            ]];
    }
    

    您可以修改/简化以上代码如下:

    var response2 = UrlFetchApp.fetch(queryUrl2);
    return response2.getContentText();
    

    这意味着我们脚本的起点现在将是与我最初开始使用的不同的字符串。该字符串将包含整个响应,而不对其进行任何更改。

    此字符串返回到名为json2 的变量。然后我执行以下操作:

    var json2 = ... ; // this is the string response from the above `fetch`.
    
    var place = JSON.parse(json2).result; // parse the string to an object.
    
    // Now we can access the various fields we need - for example:
    var placeName = place.name;
    
    // for the list of hours:
    var weekdayTextList = place.opening_hours.weekday_text;
    weekdayTextList.forEach((weekdayText) => {
      console.log( weekdayText );
    } );
    

    上述forEach 循环将一周中的每一天打印到控制台。当然,您可以将每个 weekdayText 值写入工作表。

    这与以前的基本逻辑相同 - 只是我删除了在原始方法中发生的字符串和对象之间的一些不必要的解析。


    更新 2

    这里有一种不同的方式来展示该方法,以防这比上面更容易/更清楚。

    function writeToSpreadsheet() {
      var results = COMBINED('');
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange(1, 1, 1, 6).setValues(results);
    }
    
    function COMBINED(text) {
      //var API_KEY = 'AIzxxxxxxxxxxxxxxxxxxxxxxxxx';
      //
      // ...all your code is still needed here, for you - but not for me in this demo.
      //
      //var json2 = response2.getContentText();
    
      var json2 = '{ "html_attributions" : [], "result" : { "formatted_address" : "8-08 43rd Rd, Long Island City, NY 11101, USA", "formatted_phone_number" : "(347) 688-2337", "name" : "Big aLICe Brewing", "opening_hours" : { "open_now" : false, "periods" : [ { "close" : { "day" : 0, "time" : "2000" }, "open" : { "day" : 0, "time" : "1200" } }, { "close" : { "day" : 1, "time" : "2100" }, "open" : { "day" : 1, "time" : "1600" } }, { "close" : { "day" : 2, "time" : "2100" }, "open" : { "day" : 2, "time" : "1600" } }, { "close" : { "day" : 3, "time" : "2100" }, "open" : { "day" : 3, "time" : "1600" } }, { "close" : { "day" : 4, "time" : "2100" }, "open" : { "day" : 4, "time" : "1600" } }, { "close" : { "day" : 5, "time" : "2200" }, "open" : { "day" : 5, "time" : "1200" } }, { "close" : { "day" : 6, "time" : "2200" }, "open" : { "day" : 6, "time" : "1200" } } ], "weekday_text" : [ "Monday: 4:00 – 9:00 PM", "Tuesday: 4:00 – 9:00 PM", "Wednesday: 4:00 – 9:00 PM", "Thursday: 4:00 – 9:00 PM", "Friday: 12:00 – 10:00 PM", "Saturday: 12:00 – 10:00 PM", "Sunday: 12:00 – 8:00 PM" ] }, "types" : [ "food", "point_of_interest", "establishment" ], "url" : "https://maps.google.com/?cid=10003627310223249349", "website" : "http://bigalicebrewing.com/" }, "status" : "OK" }';
    
      var place = JSON.parse(json2).result;
    
      var weekdays = '';
      place.opening_hours.weekday_text.forEach((weekdayText) => {
        weekdays += ( weekdayText + '\r\n' );
      } );
    
      var data = [ [
        place.name,
        place.formatted_address,
        place.formatted_phone_number,
        place.website,
        place.url,
        weekdays.trim()
      ] ];
    
      return data;
    
    }
    

    这会使用之前的 forEach 循环从您的 weekday_text 构建一个字符串。但这次我展示了如何将它与我认为您需要的其他数据结合起来。

    我的代码和您的代码之间的最大区别在于您的代码从 URL 获取其数据 - 但我的代码只是将该数据硬编码到代码中,因为我们试图解决的问题与获取数据无关.

    运行此代码的结果是电子表格中的一个条目,如下所示:

    这是基于您问题中的代码 - 这次我忽略了 Ghostbin 的代码,因为我认为这可能使事情变得更加复杂/令人困惑。

    【讨论】:

    • 目前我的代码获取一个地点的 URL 并解析文本。我是否需要创建一个新变量来解析这个特定元素? ghostbin.co/paste/64cmd
    • 有趣 - 保留 response2.getContentText(); 的确切内容并返回它可能会更容易,而不是返回您当前返回的内容。但是我们需要看看那个文本是什么样子的。您可以编辑您的问题以将此数据显示为文本吗?我可以相应地更新我的答案。
    • 底线是:不需要对那些 replace() 函数进行额外的解析。但这完全取决于原始响应的样子。
    • 用代码更新了主帖。但是您应该能够从我的 Google App 脚本顶部的链接中查看/编辑我的代码。这是名为“COMBINED”的函数script.google.com/home/projects/…
    • 抱歉,这不是我要查找的代码,而是 JSON 文本字符串,我在问题本身中看不到。可以通过链接访问它,但我宁愿避免使用这些链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2022-06-11
    • 2018-08-16
    相关资源
    最近更新 更多