Java解析json⽂件为对象
需求来源
在项⽬中经常会遇到从第三⽅接⼝调⽤数据的情况,⽐如爬⾍、封装接⼝,但是这个时候接收到的数据也是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;
}
fastjson字符串转数组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();
}
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⽂件读取完成

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。