我正在使用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支持)。

09-25 18:15