双重解析JSON数据(或使用另一种方法进行拆分)
Double parse JSON data (or use another method to split)
想知道拆分来自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
});
问题的关键是:"我如何访问每个功能集合?"sucess
或done
回调是您可以确保接收到数据的地方,并且可以将其添加到映射中。
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请求,以便您可以在块中处理它。您应该能够使用它来满足您的需求。
- jQuery:使用substr()的另一种方法
- 如何访问对象's成员通过另一种方法填充的方法
- 检查窗口是否为弹出窗口的另一种方法
- 将某些内容写入控制台的另一种方法,然后控制台.log
- 从同一控制器 Angularjs 中的另一种方法访问$scope变量
- 另一种在PageLoad上使对象的定时淡入效果的方法
- 修改 yii.activeForm 是个好主意吗.js如果不是,另一种方法是什么
- 将复选框数组传递到 $_GET 的另一种方法 - 除了方括号
- 指南针/咖啡可以做到这一点吗?另一种方法
- 另一种在javascript中创建随机动态url的方法/阻止wpengine缓存
- 为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用
- 获取数组 Javascript 的所有整数组合的另一种方法
- Don'我不明白为什么这个JavaScript函数可以用一种方法调用,而不能用另一种方法
- 具有自身内在价值的对象.另一种做getter的方法
- 如何在生成响应后,用另一种方法从ajax请求中获取响应
- 另一种方法是让chrome、IE 8和firefox提交相同的表单
- 正在寻找另一种方法来进行isNaN测试
- 如何使用javascript在另一种方法中访问数组
- 用jquery预处理html的一种方法有效,但为什么另一种方法无效't
- 另一种防止垃圾邮件的方法