双重解析JSON数据(或使用另一种方法进行拆分)

Double parse JSON data (or use another method to split)

本文关键字:方法 另一种 拆分 JSON 数据      更新时间:2023-09-26

想知道拆分来自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以在地图上显示图层。每一层都有一个名称(路径、床等),并在Rails中编码为GeoJSON,然后用AJAX命令发送给Javascript。如果我只发送一个图层,我就可以毫不费力地解析数据并将其放到地图上。一个典型的代码行看起来像pathMarkers = L.geoJSON(JSON.parse(data)) .

我现在需要传递多个图层到地图。我的理解是AJAX只能处理一个对象,所以我将路径和床合并到一个对象中。当我到达Javascript端时,我不知道该做什么。换句话说,我只需要获取具有pathmarker路径数据的那部分对象,以及具有bedmarker床数据的那部分对象。

这就是我想要做的:

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。

假设我理解正确,您关心的是在地理库中引入不同的数据层,如Leaflet.js一个AJAX请求是好的除非JSON有效载荷太大,它会崩溃浏览器。

由于您没有提供太多的代码,下面是您将如何做的一个一般示例。

首先创建映射对象。显然:)

const map = L.map(id).setView([1.2345, -1.2345], 10);

启动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
});

问题的关键是:"我如何访问每个功能集合?"
sucessdone回调是您可以确保接收到数据的地方,并且可以将其添加到映射中。

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, paths),你所需要做的就是迭代每个键,并将每个键传递给传单的geoJSON方法进行渲染。

我之前在移动设备上遇到过这个问题(准确地说,是带有Phonegap的iOS)。您可能想要查看名为OboeJS的库,网址为http://www.juancaicedo.com/oboe.js-website/。

本质上,该库流式传输JSON请求,以便您可以在块中处理它。您应该能够使用它来满足您的需求。