javascript - 如何强制 jsonStringify 输出不带引号的数组?

标签 javascript google-apps-script geojson

我正在使用 Google Apps 脚本通过调用 jsonStringify 将 Google 电子表格中的数据格式化为 geoJSON 。我的代码修改自this original example 。电子表格中的每一行代表一个国家/地区,其中一个单元格包含相关的 geoJSON 多边形数据:

[[[74.92,37.24],[74.57,37.03],...[73.31,37.46],[74.92,37.24]]]

但是由于该单元格不包含数字,因此 jsonStringify 会将其解析为字符串,并返回:

"coordinates":["[[[74.92,37.24],[74.57,37.03],...[73.31,37.46],[74.92,37.24]]]"]

...我无法使用它,因为引号使其成为无效的 geoJSON。当我输入一个数字时,jsonStringify 返回它时不带引号,我假设是因为它识别出它是一个数字。有什么方法可以强制它将多边形数据解释为数字或以其他方式转义引号?这是我的代码的相关部分:

function getObjects(data, keys) {
  var objects = [];
  var headers = getHeaders(sheet, activeRange, 1);

  var zip = function(keys, data) {
    var obj = {};
    for (var i = 0; i < keys.length; i++) {
        obj[keys[i]] = data[i];
    }
    return obj;
  };

  for (var i = 0; i < data.length; i++) {
    var obj = zip(headers, data[i]);

//this is the polygon data
    var poly = obj[settings.poly];

    var coordinates = [poly];

    // If we have an id and polygon data
    if (obj[settings.id] && poly) {
      // Define a new GeoJSON feature object
      var feature = {
        type: 'Feature',
        // Get ID from UI
        id: obj[settings.id],
        geometry: {
          type: 'MultiPolygon',
          // Get coordinates from UIr
          coordinates: coordinates
        },
        // Place holder for properties object
        properties: obj
      };
      objects.push(feature);
    }
  }
  return objects;
}

最佳答案

不要将字符串作为“坐标”传递给jsonStringify,而是传递实际数组。即使用jsonParse首先在原文上(根据需要)获取相关对象。

示例转换(带有可能合适也可能不合适的保护)可能如下所示:

function restoreCoordinatesFromText(source) {
    var geo = Utilities.jsonParse(source);
    return (geo && (geo instanceof Array)
            ? geo                 // looks like we got our [array of stuff]
            : theSourceData);     // dunno, let's act like we never saw it
}

随后,实际坐标数组可以在 JSON 中正确编码,而字符串会表现出最初的不良行为。

var coords = "[1,2,3,4]"; /* just a string */

var json = Utilities.jsonStringify({
                     /* array, good! */
    goodCoordinates: restoreCoordinatesFromText(coords),
                     /* string, bad! */
    badCoordinates:  coords
});

这是corresponding fiddle (它利用 ES5 JSON 支持)。

关于javascript - 如何强制 jsonStringify 输出不带引号的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747290/

相关文章:

javascript - 动态创建带分页的 HTML 表格

google-apps-script - 为什么来自 Google 电子表格脚本的 MailApp.sendEmail 不起作用?

google-apps-script - 如何对 Google 文档/云端硬盘文档中的标题进行编号?

flutter - 从mongodb反序列化几何多边形

go - 我怎样才能找到地球上两条线(来自 geojson 的线串)之间的距离

javascript - console.log 不使用 await 变量记录

javascript - Angular 2如何从对象数组中获取键值?

javascript - 使 Javascript RSA 消息加密给出相同的结果

javascript - 如何运行长脚本并向 html 对话框发送持续反馈

leaflet - 消除重复的多边形州/国家/地区共享边界