需求来源
在项目中经常会遇到从第三方接口调用数据的情况,比如爬虫、封装接口,但是这个时候接收到的数据也是JSON格式的,例如:
{
"type": "FeatureCollection",
"name": "张江片区",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {
"id": "3101150200",
"name": "郭守敬路277号",
"address": "郭守敬路277号"
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[
121.594180786448874,
31.210592792062734
],
[
121.594280611934437,
31.21064157924479
]
]
]
]
}
},
{
"type": "Feature",
"properties": {
"id": "3101150201",
"name": "碧波路25号底层商铺",
"address": "碧波路25号"
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[
121.586773725864916,
31.208211205543211
],
[
121.587401625582757,
31.208340233670882
],
[
121.587462997074994,
31.208121760058315
]
]
]
]
}
}
]
}
这是一个典型的GeoJSON格式的数据,看起来比较复杂,既包含普通的字符串,也有内层对象,内层中还有四维数组(别问为什么这么深,问就是地理格式要求),
那么这里如何解析呢,有两个方案,1.人工手动解析;2.使用Jackson包下的ObjectMapper解析;
人工解析
这里不做过多讨论,本人以前不知道有这个ObjectMapper,都是自己一个字段一个对象的逐层读取,用的fastjson,吃了很多亏,不希望各位再踏足其中
ObjectMapper
关于这个类的说明就不做过多的介绍了,下面主要谈谈使用方法:
1.根据json文件的格式,逐层的创建所有的类
这个很重要,说白了就是只要出现花括号{}
的地方,就是一个类,就必须为其创建一个*.java文件,以上述的json文件为例,出现了数组的地方,一般就使用List泛型集合,需要创建的类有:
FeatureCollection.java
import lombok.Data;
import java.util.List;
/**
* @author Jack
* <p>date 2021/2/23 19:28<p>
*/
@Data
public class FeatureCollection {
String type;
String name;
Crs crs;
List<MyFeature> features;
}
Crs.java
import lombok.Data;
/**
* @author Jack
* <p>date 2021/2/23 21:29<p>
*/
@Data
public class Crs {
String type;
Properties properties;
}
Properties.java
import lombok.Data;
/**
* @author Jack
* <p>date 2021/2/23 19:30<p>
*/
@Data
public class Properties {
String id;
String name;
String address;
}
MyFeature.java
这里之所以不直接使用Feature,是因为Feature.java这个类名已经在Jackson出现,为了避免重名,就另外自己取名
import lombok.Data;
/**
* @author Jack
* <p>date 2021/2/23 19:29<p>
*/
@Data
public class MyFeature {
String type;
Properties properties;
Geometry geometry;
}
Geometry.java
import lombok.Data;
/**
* @author Jack
* <p>date 2021/2/23 19:30<p>
*/
@Data
public class Geometry {
String type;
double[][][][] coordinates;
public Geometry() {
coordinates = new double[][][][]{};
}
}
至此,所有的类都创建完毕,需要注意的是,上面的类都有一个注解@Data
,如果不写这个注解,则必须为每个类手动加上get和set方法,还有toString方法
2.测试类读取:
import com.fasterxml.jackson.databind.ObjectMapper;
public class ReadJSON {
public static void main(String[] args) throws IOException {
ReadJSON readJSON = new ReadJSON();
readJSON.readJson2();
}
public void readJson2() throws IOException {
FeatureCollection featureCollection = new ObjectMapper().readValue(new File("D:\idea_project\person-home-page\home-page\src\main\resources\park.json"), FeatureCollection.class);
System.out.println(featureCollection);
}
}
因为这里读取的是本地的文件,所以需要一个new File,但是这里的参数可以是很多种类型,如
只要是合法的json数据来源即可
打印到控制台的结果如下:
至此,JSON文件读取完成