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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM