Javascript 双重解析JSON数据(或使用其他方法拆分)

Javascript 双重解析JSON数据(或使用其他方法拆分),javascript,json,ajax,Javascript,Json,Ajax,想知道最好的办法是将来自AJAX的大型数据对象分开。如果我只发送一部分(表示路径),我会使用JSON.parse(data)我真正想做的是首先将对象分割成单独的块,然后能够执行类似JSON.parse(data['paths]])的操作 下面是一个JSON数据的剪辑示例 { "paths": { "type": "FeatureCollection", "features": [{ "type": "Feature",

想知道最好的办法是将来自AJAX的大型数据对象分开。如果我只发送一部分(表示路径),我会使用
JSON.parse(data)
我真正想做的是首先将对象分割成单独的块,然后能够执行类似
JSON.parse(data['paths]])
的操作

下面是一个JSON数据的剪辑示例

{
    "paths": {
        "type": "FeatureCollection",
        "features": [{
            "type": "Feature",
            "geometry": {
                "type": "MultiLineString",
                "coordinates": [
                    [
                        [-122.32074805731085, 47.634990818586026],
                        [-122.32074412999432, 47.63497931696752],
                        [-122.32107629703529, 47.63465666282262]
                    ]
                ]
            },
            "properties": {
                "path_name": "Woodland path"
            },
            "id": 2
        }]
    },
    "beds": {
        "type": "FeatureCollection",
        "features": [{
            "type": "Feature",
            "geometry": {
                "type": "MultiPolygon",
                "coordinates": [
                    [
                        [
                            [-122.32073753862116, 47.6347629704532],
                            [-122.32071585642394, 47.63470617810399],
                            [-122.32073753862116, 47.6347629704532]
                        ]
                    ]
                ]
            },
            "properties": {
                "bed_name": "Azalea Triangle"
            },
            "id": 1
        }]
    }
}
下面是我在javascript中的内容

   $.ajax
    dataType: 'text'
    url: 'map.json'
    success: (data) ->
下面是生成调用的Rails代码

    data = { buildings: @geopaths, lawns: @geobeds }

respond_to do |format|
  format.json { render json: data }
  format.html
end
更新: 我有点回避解释我想做什么,因为我认为这会混淆问题。在一个坚果壳中——我从数据库中收集数据,并将其发送到Javascript以在地图上显示为图层。每一层都有一个名称(路径、床位等),并在使用AJAX命令发送到Javascript之前在Rails中编码为GeoJSON。如果我只发送一个图层,我就可以解析数据并将其放到地图上。典型的代码行看起来像
pathmarks=L.geoJSON(JSON.parse(data))

我现在需要将多个图层传递到地图。我的理解是AJAX只能处理一个对象,所以我将路径和床组合成一个对象。当我进入Javascript端时,我不知道该怎么做。换句话说,我只需要获取对象中包含路径标记的路径数据的部分,以及对象中包含床标记的床数据的部分

从图形上看,这就是我要做的:

paths = a bunch of GeoJSON data
beds = a bunch of GeoJSON data
Use AJAX to send paths and beds to javascript
build pathMarkers with JSON.parse for the paths data
build bedsMarkers with JSON.parse for the beds data

如果有帮助的话,我可以构建一个示例并将其发布到bitbucket。

我以前在移动设备上遇到过这个问题,因为移动设备上的有效负载非常大(确切地说是带有Phonegap的iOS)。您可能希望查看名为OboeJS的库,位于


本质上,该库将JSON请求流化,以便您可以分块处理它。您应该能够使用它来满足您的需要。

假设我理解正确,并且您关心的是将不同的数据层引入到一个geo库(如fliple.js)中,一个AJAX请求就可以了,除非JSON负载太大导致浏览器崩溃

由于您没有提供太多的代码,下面是一个一般性的示例,说明您将如何执行此操作

首先创建贴图对象。显然:)

启动AJAX请求以获取geoJSON文件

$.ajax({
  dataType: "json",
  url: '/json/lives/here.json',
  data: {} /* any props you'd like to pass as query string to your server */,
  success: success
});
问题的关键是:“如何访问每个功能集?”
成功
完成
回调中,您可以确保收到数据,并将其添加到地图中

jQuery的AJAX方法在使用
dataType:'json'
调用时,会自动为您运行
json.parse()
(以及其他一些东西)。一旦JSON被解析,就可以像JS中的任何其他对象一样访问它。 此时,
success
回调将接收转换为对象的JSON,您可以使用传统的JS方法访问该对象。像这样:

function success (data) {
    // data is the parsed JSON. It is now just a JS object.
    // Below: for every "key" in the data object, pass its data to L.geoJSON() and add it to the map.
    for (var geojsonFeatureCollection in data) {
        if (data.hasOwnProperty(geojsonFeatureCollection)) {
            L.geoJSON(geojsonFeatureCollection, {/* options */}).addTo(map);
        }
    }
}

回答您关于AJAX和单个对象的观点:AJAX与任何其他浏览器请求一样都是一个对象。
是的,您一次只发送一个请求。同样,您也会从服务器收到一个响应但是响应中包含的内容绝对可以是任何数据。所以,您在服务器端所做的是完全正确的


在您的例子中,数据由一个JSON文本文件组成,该文件稍后被解析并转换为JS对象,供您实际使用。该对象包含一组“键”(
beds
路径
),您所需要做的就是迭代这些键中的每一个,并将它们传递给传单的
geoJSON
方法进行渲染。

这没有意义。解析JSON后,您只能访问对象的各个部分。例如,
JSON.parse(data).path
。也许这是我的问题的根源——我很困惑。:)也许这会有帮助:你为什么要分手?如果解析速度变慢,请查看是否可以将服务调用拆分,例如,您可以调用
路径
,然后调用
床位
,或者其他……不,将一个json字符串拆分为多个不是一个好主意。只需将其解析为js对象/数组,然后在那里将其拆分。哇!非常感谢@tmslnz用我的炒蛋做了一顿美餐。:)你说得对,我正想这么做。很高兴分享任何有用的代码。我注意到上面的一些JS格式不正确,所以我修正了这个问题。我试图插入您的代码,但我肯定缺少了一些概念,我得到的只是“未捕获的错误:无效的GeoJSON对象”。我正在构建一个简单的演示,放在bitbucket上,但是如果发布代码更容易,请让我知道。“无效的GeoJSON”听起来像是你的服务器把它搞砸了,从控制台上我可以看出。dig geofeaturecollection只包含功能的名称-没有数据。[url]=
function success (data) {
    // data is the parsed JSON. It is now just a JS object.
    // Below: for every "key" in the data object, pass its data to L.geoJSON() and add it to the map.
    for (var geojsonFeatureCollection in data) {
        if (data.hasOwnProperty(geojsonFeatureCollection)) {
            L.geoJSON(geojsonFeatureCollection, {/* options */}).addTo(map);
        }
    }
}