I was having some problem when trying to extract data returned from JSON and store as Polyline object. The JSON format as such:
{
"messages": [
],
"routes": {
"fieldAliases": {
"ObjectID": "ObjectID",
"Name": "Name",
"FirstStopID": "FirstStopID",
"LastStopID": "LastStopID",
"StopCount": "StopCount",
"Total_Meters": "Total_Meters",
"Shape_Length": "Shape_Length"
},
"geometryType": "esriGeometryPolyline",
"spatialReference": {
"wkid": 3414,
"latestWkid": 3414
},
"features": [
{
"attributes": {
"ObjectID": 1,
"Name": "18304.68,36152.73 - 21591.48,33095.24",
"FirstStopID": 1,
"LastStopID": 2,
"StopCount": 2,
"Total_Meters": 6757.9427813693819,
"Shape_Length": 6757.9404808662866
},
"geometry": {
"paths": [
[
[
18301.44000000041,
36146.919999999925
],
[
21206.919999999925,
33505.550000000745
],
[
21341.230000000447,
33566.929999999702
],
And the code where I get the returned JSON and store each point as a Polyline object:
public void getDirection(Event eventModel){
String eventX = eventModel.getEventX();
Log.i("X", eventX);
String eventY = eventModel.getEventY();
Log.i("Y", eventY);
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(
Color.GREEN, 3, SimpleLineSymbol.STYLE.DASH);
List pointArr = null;
String page;
JSONArray jsonArray;
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.onemap.sg/API/services.svc/route/solve?token=qo/s2TnSUmfLz+32CvLC4RMVkzEFYjxqyti1KhByvEacEdMWBpCuSSQ+IFRT84QjGPBCuz/cBom8PfSm3GjEsGc8PkdEEOEr&routeStops=18304.68,36152.73;" + eventX + "," + eventY + "&routemode=DRIVE&avoidERP=0&routeOption=shortes");
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
page = "{\'EventDirection\':" + responseString + "}";
try {
JSONObject jsonObject = new JSONObject(page);
jsonArray = jsonObject.getJSONArray("EventDirection");
int length = jsonArray.length();
for (int i = 0; i < length; i++) {
JSONObject attribute = jsonArray.getJSONObject(i);
if(attribute.equals("features")){
if(attribute.equals("geometry")){
String path = attribute.getString("paths");
pointArr.add(path);
/*path = path.replace("[[\"", "");
path = path.replace("\"]]", "");
String[] arr = path.split(";");
for (int j = 0; j < arr.length; j++) {
String[] point = arr[j].split(",");
pointArr.add(point);
}*/
}}
}
Graphic lineGraphic = new Graphic((Geometry) pointArr, lineSymbol);
ENeighbourhoodActivity.graphicsLayer.addGraphic(lineGraphic);
} catch (JSONException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
And the stack trace I've gotten:
11-24 20:32:19.425: D/dalvikvm(16607): GC_CONCURRENT freed 719K, 13% free 12030K/13703K, paused 7ms+13ms
11-24 20:32:19.628: W/System.err(16607): org.json.JSONException: Value {"directions":[{"features":[{"compressedGeometry":"+1+hrt+139j+0+0","attributes":{"length":0,"text":"Start at 18304.68,36152.73","time":0,"maneuverType":"esriDMTDepart","ETA":-2209161600000}},{"compressedGeometry":"+1+hrt+139j+172-lr+40-1i+1l-e+23-3+d+4+1d+r","attributes":{"length":1.7571306436022183,"text":"Go southeast on PAN ISLAND EXPRESSWAY","time":1.8785585885556129,"maneuverType":"esriDMTStraight","ETA":-2209161600000}},{"compressedGeometry":"+1+jch+12ik+i+1o+d+1v","attributes":{"length":0.12315161844398603,"text":"Bear left on TOH TUCK AVENUE","time":0.18480000000000038,"maneuverType":"esriDMTBearLeft","ETA":-2209161600000}},{"compressedGeometry":"+1+jdg+12mb+14-1+42+1b+p+m+11+2a+c+e+l+e+r+9+1q+2+o+5+1m+e+1v+o+3u+c+1u+0+1q-6+3a-i+11+2+1e+k+1k+12+1o+o+p+a+1p+a+m+8+m+b+2d+s+1g+t","attributes":{"length":1.3971933538812136,"text":"Turn right on TOH TUCK ROAD","time":2.7943955099999993,"maneuverType":"esriDMTTurnRight","ETA":-2209161600000}},{"compressedGeometry":"+1+kl9+132b+1l-1i+19-o+g-3+2e-8+3h-5+44-2+1i+4+1r+u+v+11+2v+43","attributes":{"length":0.78371010402386,"text":"Turn right on JALAN JURONG KECHIL","time":1.175752590000001,"maneuverType":"esriDMTTurnRight","ETA":-2209161600000}},{"compressedGeometry":"+1+la5+135l+1g-23+29-2o+1f-2d+d-1b+0-23-b-17-k-1n+0-h+8-l+o-r","attributes":{"length":0.5739351553531507,"text":"Turn right on JALAN ANAK BUKIT","time":0.9289808300000004,"maneuverType":"esriDMTTurnRight","ETA":-2209161600000}},{"compressedGeometry":"+1+lfr+12m0+dd-4m+qr-94+19n-ej+1j-n+82-56+gl-b4+5l-1a+3n-b+q-5+i-4+2k-13+4t-l+9p-14+co-3a+1r-j+1k-4+5o-1t+u-3+c+6+i+f+d+h","attributes":{"length":5.512234370362195,"text":"Bear left on DUNEARN ROAD","time":8.347599999999996,"maneuverType":"esriDMTBearLeft","ETA":-2209161600000}},{"compressedGeometry":"+1+qge+10ut+10+30+2p+5h","attributes":{"length":0.2995301962581563,"text":"Bear left on WHITLEY ROAD","time":0.4492,"maneuverType":"esriDMTBearLeft","ETA":-2209161600000}},{"compressedGeometry":"+1+qk7+117e+h-4+1p-1a+29-2o+j-b+q-2+b+4+h+c+c+h+10+2a+b+d+e+8+3n+3","attributes":{"length":0.5376352927205378,"text":"Turn right on MALCOLM ROAD","time":1.2903999999999978,"maneuverType":"esriDMTTurnRight","ETA":-2209161600000}},{"compressedGeometry":"+1+r0v+116u+f-k+l-a+t-1+s+7+1i+j+u+h+m+g+o+p+11+1f+11+u","attributes":{"length":0.35816860827144775,"text":"Turn right at UNNAMED ROAD to stay on MALCOLM ROAD","time":0.8596014644118043,"maneuverType":"esriDMTTurnRight","ETA":-2209161600000}},{"compressedGeometry":"+1+r9s+11b0+0+0","attributes":{"length":0,"text":"Finish at 27985.4,34115, on the right","time":0,"maneuverType":"esriDMTStop","ETA":-2209161600000}}],"summary":{"totalDriveTime":17.909288982967414,"totalTime":17.909288986120373,"envelope":{"ymin":33719.41002910024,"ymax":36152.73002910059,"xmin":18301.436076220416,"spatialReference":{"latestWkid":3414,"wkid":3414},"xmax":27985.400018159162},"totalLength":11.342689342916765},"routeName":"18304.68,36152.73 - 27985.4,34115","routeId":1}],"routes":{"features":[{"geometry":{"paths":[[[18301.44000000041,36146.919999999925],[18885.830000000075,35820.75999999978],[19550.639999999665,35448.38000000082],[19679.16000000015,35397.5700000003],[19731.700000000186,35383.86999999918],[19799.240000000224,35381.169999999925],[19812.37999999989,35385.49000000022],[19828.570000000298,35394.31000000052],[19856.860000000335,35412.300000000745],[19875.230000000447,35468.13000000082],[19885.419999999925,35519.13000000082],[19887.83999999985,35531.25999999978],[19924.03000000026,35530.199999999255],[20053.900000000373,35572.88000000082],[20071.599999999627,35586.460000000894],[20078.78000000026,35595.31000000052],[20088.94000000041,35614.65000000037],[20111.830000000075,35668.51999999955],[20124.389999999665,35682.72000000067],[20145.12999999989,35697.40000000037],[20171.889999999665,35706.49000000022],[20229.700000000186,35708.38000000082],[20254.44000000041,35712.52999999933],[20308.200000000186,35726.9299999997],[20361.94000000041,35748.6799999997],[20371.480000000447,35751.439
11-24 20:32:19.651: W/System.err(16607): at org.json.JSON.typeMismatch(JSON.java:100)
11-24 20:32:19.651: W/System.err(16607): at org.json.JSONObject.getJSONArray(JSONObject.java:548)
11-24 20:32:19.651: W/System.err(16607): at Controller.EventController.getDirection(EventController.java:222)
11-24 20:32:19.651: W/System.err(16607): at AsyncTask.GetEventDirectionAsyncTask.doInBackground(GetEventDirectionAsyncTask.java:21)
11-24 20:32:19.651: W/System.err(16607): at AsyncTask.GetEventDirectionAsyncTask.doInBackground(GetEventDirectionAsyncTask.java:1)
11-24 20:32:19.651: W/System.err(16607): at android.os.AsyncTask$2.call(AsyncTask.java:264)
11-24 20:32:19.651: W/System.err(16607): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-24 20:32:19.651: W/System.err(16607): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-24 20:32:19.651: W/System.err(16607): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
11-24 20:32:19.651: W/System.err(16607): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-24 20:32:19.651: W/System.err(16607): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-24 20:32:19.651: W/System.err(16607): at java.lang.Thread.run(Thread.java:856)
11-24 20:32:40.862: W/SurfaceView(16607): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
Any guides? Thanks in advance.
EDIT
try {
JSONObject jsonObject = new JSONObject(page);
JSONObject myObject = jsonObject.getJSONObject("routes");
JSONArray features = myObject.getJSONArray("features");
JSONObject geometry = features.getJSONObject(1);
jsonArray = geometry.getJSONArray("paths");
int length = geometry.length();
for (int i = 0; i < length; i++) {
JSONObject attribute = jsonArray.getJSONObject(i);
String path = attribute.getString("paths");
path = path.replace("[[\"", "");
path = path.replace("\"]]", "");
String[] arr = path.split(";");
for (int j = 0; j < arr.length; j++) {
String[] point = arr[j].split(",");
pointArr.add(point);
}
}
The problem is that the JSON you are obtaining is the following one: (excerpt obtained from your stack trace): You can see the data structure is quite different from what you expect:
The way to browse is understanding which part is a JSONObject and which one is an JSONArray... and that's ease: look at my comments
So you have a JSON Object which the following attributes:
directionsandroutes, androutesis another object which have an attribute namedfeatures, which is an array of elements where the first attribute of each one must begeometry, which is an object where the first attribute ispath... divide and you'll win