JSON.parse在带有数组的for循环中给出了SyntaxError

时间:2013-04-18 16:57:43

标签: javascript json google-maps google-maps-api-3

我有一个带有方向渲染器json的数组,它们是字符串化的。

array[1].direction = '{\"routes\":[{\"bounds\":\"\....'
array[1].direction = '{\"routes\":[{\"bounds\":\"\....'
.
.

这就是我在地图上渲染这些json的方法。

for (var x=2; x<array.length; x++) {

        renderDirections(array[x].direction);
    }

function renderDirections(result){

     var directionRenderer = new google.maps.DirectionsRenderer();

       myDirections = JSON.parse(result, function(name, value){

         if(/^LatLngPlaceHolder\(/.test(value)) { 
                    var match = /LatLngPlaceHolder\(([^,]+),([^,]+)\)/.exec(value);
                    return new google.maps.LatLng(match[1], match[2]);
                } 
         else{
           return value;
         }
        });

      directionRenderer.setMap(map);
      directionRenderer.setDirections(myDirections);
      directionRenderer.setOptions({suppressMarkers:true,preserveViewport:true});
    }

执行此操作会在JSON.parse行中出现"Uncaught SyntaxError: Unexpected token \"错误。

但是,如果我这样做:

for (var x=2; x<array.length; x++) {

        var examplejson = '{\"routes\":[{\"bounds\":\"\....'; //note that its an example json which i logged from `array[x].direction`
        renderDirections(examplejson);
    }

它渲染了json。

2 个答案:

答案 0 :(得分:2)

只有在要解析为对象的字符串中创建JSON时,才需要\。从第一个例子中删除\,你就会有更好的运气。

array[1].direction = {"routes":[{"bounds":"....

\告诉解析器“不要将引号视为终结符,而是将其视为字符。”在引用的字符串之外,它只是不正确。

答案 1 :(得分:1)

您不必以这种方式创建方向对象。如果你正在构建一个动态json,那么你应该做这样的事情:

var array = [];
var obj = {
   key: "value",
   key2: "value2",
   key3: 3
};
array.push(obj);

如果从服务器收到key和key2的值,则只需用包含该值的变量替换硬编码字符串即可。以上述方式编码对象也更容易维护。编写手动编码的json对象是可怕的。你永远不会知道编辑时会出现什么错误。 如果您需要序列化该数组以进行存储,您可以只使用JSON.stringify(array),这将返回一个json编码的字符串,您可以通过网络传输甚至存储在localStorage中。

根据我向您展示的方法,您根本不需要JSON.parse,因此您可以避免在循环中不必要地调用JSON.parse。如果你有不同的原因来创建json对象,就像你的方式一样,你应该在你的问题中说明。但不管怎样,你不应该这样做。