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;
}

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文件读取完成

posted on 2021-02-26 11:02  高冷的恒哥  阅读(5392)  评论(0编辑  收藏  举报