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

  • 相关阅读:
    linux解压缩各种命令
    memset
    STRUCT_OFFSET( s, m )宏
    请问这个宏是什么意思 #define NOTUSED(v) ((void) v)?
    typedef特殊用法:typedef void* (*fun)(void*)
    localtime、localtime_s、localtime_r的使用
    Git使用(一)
    【转】linux gcc _attribute__((weak)) 简介及作用
    我的技术博客
    .net 4.0(2.0)“检测到有潜在危险的 Request.Form 值”的解决方法
  • 原文地址:https://www.cnblogs.com/dabenhou/p/14451224.html
Copyright © 2020-2023  润新知