需求來源
在項目中經常會遇到從第三方接口調用數據的情況,比如爬蟲、封裝接口,但是這個時候接收到的數據也是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文件讀取完成