说明:
从HTTP server获取一个JSON文件后进行解析,此例子主要说明如何利用JSONObject和JSONArray来对对象和数组等元素进行解析。
文件内容:
{
"header":{
"stamp":14321212,
"frame_id":base_laser
}
"mapInfo":{
"gridWidth":1000, // 栅格地图宽度
"gridHeight":1000, // 栅格地图大小
"originX": -41.273852042959405, // 坐标系原点x
"originY": -39.639522665878005, // 坐标系原点y
"resolution": 0.05 // 栅格化比例即1:20
},
"gridPhits":[{x:111,y:111},{x:111,y:111},{x:111,y:111}], //栅格化后的激光位置
"worldPhits":[
{
"x": -0.00000000000180135178,
"y": 0.00000002584042026,
"z": 0
},
{
"x": -0.00000000000180135178,
"y": 0.00000002584042026,
"z": 0
},
{
"x": -0.00000000000180135178,
"y": 0.00000002584042026,
"z": 0
}]
}
解析代码:
LaserPhit类对应此文件,父类定义一些共有数据,因为有不同格式的JSON文件要处理,里面会有一些共同的内容。
LaserPhit.java
class LaserPhit extends GSResponse{
//http的get路径
private static final String mJsonPath = "/gs-robot/real_time_data/laser_phit";
private static final String TAG = "LaserPhit";
//对应文件数据结构,定义见后面的父类
Header header = new Header();
MapInfo mapInfo = new MapInfo();
ArrayList<Point> mGridPhits = new ArrayList<Point>();
ArrayList<Coordinate> mWorldPhits = new ArrayList<Coordinate>();
public LaserPhit(){
super(mJsonPath);
}
//解析接口
public void parseJsonData(JSONObject object){
try {
parseHeader(object, header);
parseMapInfo(object, mapInfo);
//GridPhit
parseGridPhit(object, mGridPhits);
//WorldPhit
parseWorldPhit(object, mWorldPhits);
Log.i(TAG, "parseJsonData: done");
} catch (Exception e) {
e.printStackTrace();
}
}
}
父类GSResponse.java
public abstract class GSResponse {
class Header {
int mstamp;
String mFrameId;
}
class MapInfo{
int mGridWidth;
int mGridHeight;
double mOriginX;
double mOriginY;
double mResolution;
}
private static final String TAG = "GSResponse";
private String mServer = "http://10.89.19.99";
private String mJsonPath;
public GSResponse(String mJsonPath){
this.mJsonPath = mJsonPath;
}
private String getJsonFilePath(){
return mServer+mJsonPath;
}
public void parseJsonData(JSONObject object){
parseResponseStatus(object, mResponseStatus);
Log.i(TAG, "parseJsonData: done ");
}
public void parseHeader(JSONObject object, Header header){
try {
JSONObject objectHeader = object.getJSONObject("header");
header.mstamp = objectHeader.getInt("stamp");
//TODO, which type should i define?
header.mFrameId = objectHeader.getString("frame_id");
} catch (Exception e) {
e.printStackTrace();
}
}
public void parseGridPhit(JSONObject object, ArrayList<Point> gridPhitList){
try {
JSONArray gridPhits = object.getJSONArray("gridPhits");
for(int i=0 ; i<gridPhits.length(); i++) {
Point pos = new Point();
JSONObject objectGridPhits = gridPhits.getJSONObject(i);
pos.x = objectGridPhits.getInt("x");
pos.y = objectGridPhits.getInt("y");
Log.i(TAG, "parseGridPhit: x:"+pos.x+" y:"+pos.y);
gridPhitList.add(pos);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void parseWorldPhit(JSONObject object, ArrayList<Coordinate> worldPhitsList){
try {
JSONArray worldPhits = object.getJSONArray("worldPhits");
for(int i=0 ; i<worldPhits.length(); i++) {
Coordinate cd = new Coordinate();
parseCoordinate(worldPhits.getJSONObject(i), cd);
worldPhitsList.add(cd);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void parseMapInfo(JSONObject object, MapInfo mi) {
try {
JSONObject objectMapInfo = object.getJSONObject("mapInfo");
mi.mGridWidth = objectMapInfo.getInt("gridWidth");
mi.mGridHeight = objectMapInfo.getInt("gridHeight");
mi.mOriginX = objectMapInfo.getDouble("originX");
mi.mOriginY = objectMapInfo.getDouble("originY");
mi.mResolution = objectMapInfo.getDouble("resolution");
} catch (Exception e) {
e.printStackTrace();
}
}
}