Luoml's blog

复杂json解析

目标:借助fastjson将json串解析成Java对象。json串及java对象结构如下:

json串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"positionData": {
"deadReckoningPosition": {
"lon": "111.91113900000000",
"lat": "21.68800700000000"
},
"rawPosition": {
"lon": "115.91113800000000",
"lat": "28.68801700000000"
},
"deltaPositionArray": [
{
"deltaTimeInSec": "0",
"deltaLon": "0.00000000000000",
"deltaLat": "0.00000000000000"
},
{
"deltaTimeInSec": "1000",
"deltaLon": "100.00000000000000",
"deltaLat": "20.00000000000000"
}
],
"heading": "10",
"visibleSatelliteNumber": "5",
"altitude": "2",
"rawPositionUncertaintyEstimate": "3"
}
}

java对象

1
2
3
4
5
6
7
8
9
10
11
12
public class PositionData {
private Position deadReckoningPosition;
private Position rawPosition;
private List<DeltaPosition> deltaPositionArray;
private String heading;
private Short visibleSatelliteNumber;
private Short altitude;
private Short rawPositionUncertaintyEstimate;

//以下省略getter/setter
...
}

首先,在pom文件中引入fastjson依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.16</version>
</dependency>

然后,编写测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
String str = "{\"positionData\":{\"deadReckoningPosition\":{\"lon\":\"111.91113900000000\",\"lat\":\"21.68800700000000\"},\"rawPosition\":{\"lon\":\"115.91113800000000\",\"lat\":\"28.68801700000000\"},\"deltaPositionArray\":[{\"deltaTimeInSec\":\"0\",\"deltaLon\":\"0.00000000000000\",\"deltaLat\":\"0.00000000000000\"},{\"deltaTimeInSec\":\"1000\",\"deltaLon\":\"100.00000000000000\",\"deltaLat\":\"20.00000000000000\"}],\"heading\":\"10\",\"visibleSatelliteNumber\":\"5\",\"altitude\":\"2\",\"rawPositionUncertaintyEstimate\":\"3\"}}";

JSONObject object = JSON.parseObject(str);
JSONObject positionDataJson = (JSONObject) object.get("positionData");

positionDataJson.getObject("deadReckoningPosition", Position.class);
positionDataJson.getObject("rawPosition", Position.class);

JSONArray deltaPositionArray = positionDataJson.getJSONArray("deltaPositionArray");
JSON.parseArray(deltaPositionArray.toJSONString(), DeltaPosition.class);

PositionData positionData = JSON.parseObject(positionDataJson.toJSONString(), PositionData.class);
System.out.println(positionData);
}

测试结果如下:

1
PositionData [deadReckoningPosition=Position [lon=111.91113900000000, lat=21.68800700000000], heading=10, deltaPositionArray=[DeltaPosition [deltaTimeInSec=0, deltaLon=0.00000000000000, deltaLat=0.00000000000000], DeltaPosition [deltaTimeInSec=1000, deltaLon=100.00000000000000, deltaLat=20.00000000000000]], visibleSatelliteNumber=5, altitude=2, rawPosition=Position [lon=115.91113800000000, lat=28.68801700000000], rawPositionUncertaintyEstimate=3]

Fork me on GitHub