如何强制jsonStringify输出没有引号的数组?

时间:2013-11-02 21:51:37

标签: 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;
}

1 个答案:

答案 0 :(得分:0)

不是将字符串作为“坐标”传递给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支持)。