java解析大json包的两种方式

该代码示例展示了两种不同的JSON解析方法,一种使用Gson库,另一种使用Jackson库。这两种方法都涉及从URL下载GZipped内容,解压缩并解析JSON数据。解析过程中,它们分别创建并填充自定义对象,如CustomEngineObjectVO、ModelProperties及其相关属性。同时,代码还包含了文件下载、错误处理和资源释放的逻辑。
摘要由CSDN通过智能技术生成

方式一:使用gson-2.8.6.jar包

package com.utils;

import com.bzl.model.vo.CustomEngineObjectVO;
import com.entity.CustomEngineObject;
import com.entity.EngineObject;
import com.google.gson.stream.JsonReader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.GZIPInputStream;

/**
 * 解析自定义属性
 *
 * @author
 * @date 2022/6/27 17:45
 **/
@Component
@Slf4j
public class AnalysisPropertiesUtil {

    /**
     * 解析自定义属性
     *
     * @param customerPropertyUrlGz
     * @return
     * @throws Exception
     */
    private void analysisCustomProperties(String customerPropertyUrlGz) throws Exception {
        URL url = new URL(customerPropertyUrlGz);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.connect();
        InputStream in = conn.getInputStream();
        GZIPInputStream gzin = new GZIPInputStream(in);
        InputStreamReader inputStreamReader = new InputStreamReader(gzin, "UTF-8");
        //进行转换
        parseJson(inputStreamReader);
    }

    private void parseJson(InputStreamReader inputStreamReader) throws IOException {
        JsonReader reader = new JsonReader(inputStreamReader);
        reader.beginObject();
        CustomEngineObjectVO customEngineObject = new CustomEngineObjectVO();
        while (reader.hasNext()) {
            switch (reader.nextName()) {
                case "fileId":
                    customEngineObject.setFileId(reader.nextString());
                    break;
                case "modelPropertyDTOList":
                    parseModelPropertyDTOList(reader);
                    break;
                default:
                    reader.skipValue();
                    break;
            }
        }
        reader.endObject();
        reader.close();
    }

    private void parseModelPropertyDTOList(JsonReader reader) throws IOException {
        reader.beginArray();
        CustomEngineObject customEngineObject001;
        while (reader.hasNext()) {
            customEngineObject001 = new CustomEngineObject();
            reader.beginObject();
            while (reader.hasNext()) {
                switch (reader.nextName()) {
                    case "propertySets":
                        parsePropertySets(reader, customEngineObject001);
                        break;
                    case "uuid":
                        customEngineObject001.setUuid(reader.nextString());
                        break;
                    default:
                        reader.skipValue();
                        break;
                }
            }

            reader.endObject();
        }
        reader.endArray();
    }

    private void parsePropertySets(JsonReader reader, CustomEngineObject customEngineObject001) throws IOException {
        reader.beginArray();
        List<EngineObject.PropertySet> propertySets = new ArrayList();
        EngineObject.PropertySet propertySet;
        while (reader.hasNext()) {
            propertySet = new EngineObject.PropertySet();
            reader.beginObject();
            while (reader.hasNext()) {
                switch (reader.nextName()) {
                    case "name":
                        propertySet.setName(reader.nextString());
                        break;
                    case "properties":
                        List<EngineObject.Property> properties = new ArrayList<>();
                        parseProperties(reader, properties);
                        propertySet.setProperties(properties);
                        break;
                    default:
                        reader.skipValue();
                }
            }
            propertySets.add(propertySet);
            reader.endObject();
        }
        reader.endArray();
        customEngineObject001.setPropertySets(propertySets);
    }

    private void parseProperties(JsonReader reader, List<EngineObject.Property> properties) throws IOException {
        EngineObject.Property property;
        reader.beginArray();
        while (reader.hasNext()) {
            reader.beginObject();
            property = new EngineObject.Property();
            while (reader.hasNext()) {
                switch (reader.nextName()) {
                    case "name":
                        property.setName(reader.nextString());
                        break;
                    case "value":
                        property.setValue(reader.nextString());
                        break;
                    default:
                        reader.skipValue();
                }
            }
            reader.endObject();
            properties.add(property);
        }
        reader.endArray();
    }

}

方式二:使用jackson-core-2.11.2.jar

package com.integration.utils;

import com.integration.feign.bean.ModelProperties;
import com.integration.feign.service.BtpChangeUrlFeignClientService;
import com.bzl.bimdc.exceptions.BimdcException;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.MappingJsonFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.zip.GZIPInputStream;

/**
 * 解析固有属性信息
 *
 * @author
 * @date 2022/6/9 17:45
 **/
@Component
@Slf4j
public class AnalysisFixedPropertiesUtil {
    @Resource
    private BtpChangeUrlFeignClientService btpChangeUrlFeignClientService;

    /**
     * 解析固有属性
     *
     * @param propertyJsonUrlGz
     * @return
     * @throws Exception
     */
    public void analyzeFixedProperties(String propertyJsonUrlGz) {
        File originPropertyFile = null;
        try {
            //下载固有属性
            log.info("获取图形引擎固有属性数据成功,固有属性链接为:{}", propertyJsonUrlGz);
            originPropertyFile = downloadProperty(propertyJsonUrlGz);

            if (originPropertyFile == null) {
                log.error("固有属性文件为空");
                return;
            }
            log.info("AnalysisFixedPropertiesUtil-analyzeFixedProperties-start:{}", System.currentTimeMillis());
            JsonFactory f = new MappingJsonFactory();
            JsonParser parser = f.createJsonParser(originPropertyFile);
            JsonToken currentJsonToken;
            while (!parser.isClosed()) {
                currentJsonToken = parser.nextToken();
                while (!JsonToken.END_ARRAY.equals(currentJsonToken) && !parser.isClosed()) {

                    if (JsonToken.START_OBJECT.equals(currentJsonToken)) {
                        parseOriginProperty(parser, currentJsonToken);
                    }
                    currentJsonToken = parser.nextToken();
                }
            }
            //删除属性文件
            originPropertyFile.delete();
            log.info("AnalysisFixedPropertiesUtil-analyzeFixedProperties-end:time={}", System.currentTimeMillis());
        } catch (Exception e) {
            if (null != originPropertyFile) {
                //删除属性文件
                originPropertyFile.delete();
            }
            log.error("解析固有属性失败:", e);
            throw new BimdcException(HttpStatus.BAD_REQUEST.value(), "解析固有属性失败");
        }
    }

    private void parseOriginProperty(JsonParser parser, JsonToken currentJsonToken) throws IOException {
        String key = null;
        String originPropertyUuid = null;
        ModelProperties modelProperties = new ModelProperties();
        while (!JsonToken.END_OBJECT.equals(currentJsonToken) && !parser.isClosed()) {

            if (JsonToken.FIELD_NAME.equals(currentJsonToken)) {
                key = parser.getCurrentName();
                currentJsonToken = parser.nextToken();
                if ("uuid".equals(key)) {
                    originPropertyUuid = parser.getValueAsString();
                    //设置UUID
                    modelProperties.setUuid(originPropertyUuid);
                } else if ("propertySets".equals(key)) {
                    //获取属性集
                    parsePropertySets(parser, currentJsonToken, modelProperties);
                } else if ("location".equals(key)) {
                    ModelProperties.Location location = new ModelProperties.Location();
                    //获取标高
                    parseLocation(parser, currentJsonToken, location);
                    modelProperties.setLocation(location);
                } else {
                    ignore(parser, currentJsonToken);
                }
            } else {
                currentJsonToken = parser.nextToken();
            }
        }
    }

    private void parsePropertySets(JsonParser parser, JsonToken currentJsonToken, ModelProperties modelProperties) throws IOException {
        String key = null;
        List<ModelProperties.PropertySet> propertySets = new ArrayList<>();
        ModelProperties.PropertySet propertySet;
        while (!JsonToken.END_ARRAY.equals(currentJsonToken) && !parser.isClosed()) {
            if (JsonToken.START_OBJECT.equals(currentJsonToken)) {
                propertySet = new ModelProperties.PropertySet();
                while (!JsonToken.END_OBJECT.equals(currentJsonToken) && !parser.isClosed()) {

                    if (JsonToken.FIELD_NAME.equals(currentJsonToken)) {
                        currentJsonToken = parser.nextToken();
                        key = parser.getCurrentName();
                        if ("name".equals(key)) {
                            propertySet.setName(parser.getValueAsString());
                        } else if ("properties".equals(key)) {
                            //属性集合
                            List<ModelProperties.Properties> properties = new ArrayList<>();
                            //解析属性
                            parseProperties(parser, currentJsonToken, properties);
                            propertySet.setProperties(properties);
                        } else {
                            ignore(parser, currentJsonToken);
                        }

                    }
                    currentJsonToken = parser.nextToken();
                }
                propertySets.add(propertySet);
            } else {
                currentJsonToken = parser.nextToken();
            }
        }
        modelProperties.setPropertySets(propertySets);
    }

    private void parseProperties(JsonParser parser, JsonToken currentJsonToken, List<ModelProperties.Properties> properties) throws IOException {

        while (!JsonToken.END_ARRAY.equals(currentJsonToken) && !parser.isClosed()) {
            if (JsonToken.START_OBJECT.equals(currentJsonToken)) {
                parseProperty(parser, currentJsonToken, properties);
            }
            currentJsonToken = parser.nextToken();
        }
    }

    private void parseProperty(JsonParser parser, JsonToken currentJsonToken, List<ModelProperties.Properties> properties) throws IOException {
        String key = null;
        ModelProperties.Properties property = new ModelProperties.Properties();
        while (!JsonToken.END_OBJECT.equals(currentJsonToken) && !parser.isClosed()) {
            if (JsonToken.FIELD_NAME.equals(currentJsonToken)) {
                key = parser.getCurrentName();
                currentJsonToken = parser.nextToken();

                switch (key) {
                    case "name":
                        property.setName(parser.getValueAsString());
                        break;
                    case "value":
                        property.setValue(parser.getValueAsString());
                        break;
                    default:
                        ignore(parser, currentJsonToken);
                        break;
                }
            } else {
                currentJsonToken = parser.nextToken();
            }
        }
        properties.add(property);
    }

    private void parseLocation(JsonParser parser, JsonToken currentJsonToken, ModelProperties.Location location) throws IOException {
        String key = null;
        while (!JsonToken.END_OBJECT.equals(currentJsonToken) && !parser.isClosed()) {
            if (JsonToken.FIELD_NAME.equals(currentJsonToken)) {
                key = parser.getCurrentName();
                currentJsonToken = parser.nextToken();

                switch (key) {
                    case "uuid":
                        location.setUuid(parser.getValueAsString());
                        break;
                    case "name":
                        location.setName(parser.getValueAsString());
                        break;
                    default:
                        ignore(parser, currentJsonToken);
                        break;
                }
            } else {
                currentJsonToken = parser.nextToken();
            }
        }
    }

    private void ignore(JsonParser parser, JsonToken currentJsonToken) throws IOException {
        int arrNum = 0;
        int objNum = 0;
        if (JsonToken.START_ARRAY.equals(currentJsonToken)) {
            arrNum++;
        } else if (JsonToken.START_OBJECT.equals(currentJsonToken)) {
            objNum++;
        } else if (JsonToken.END_ARRAY.equals(currentJsonToken)) {
            arrNum--;
        } else if (JsonToken.END_OBJECT.equals(currentJsonToken)) {
            objNum--;
        }
        while (arrNum > 0 || objNum > 0) {
            currentJsonToken = parser.nextToken();
            if (JsonToken.START_ARRAY.equals(currentJsonToken)) {
                arrNum++;
            } else if (JsonToken.START_OBJECT.equals(currentJsonToken)) {
                objNum++;
            } else if (JsonToken.END_ARRAY.equals(currentJsonToken)) {
                arrNum--;
            } else if (JsonToken.END_OBJECT.equals(currentJsonToken)) {
                objNum--;
            }
        }
    }

    private File downloadProperty(String url) {
        //下载固有属性
        InputStream inputStream = btpChangeUrlFeignClientService.downFile(url);

        String fileName = "property." + UUID.randomUUID().toString().replaceAll("-", "");

        File gzFile = new File(fileName + ".gz");
        BufferedOutputStream fileOutputStream = null;
        try {

            fileOutputStream = new BufferedOutputStream(new FileOutputStream(gzFile));
            int num = -1;
            byte[] buf = new byte[1024];
            while ((num = inputStream.read(buf)) != -1) {
                fileOutputStream.write(buf, 0, num);
            }

            fileOutputStream.flush();
        } catch (FileNotFoundException e) {
            log.error("AnalysisFixedPropertiesUtil.downloadProperty.下载属性包报错1。e=", e);
        } catch (IOException e) {
            log.error("AnalysisFixedPropertiesUtil.downloadProperty.下载属性包报错2。e=", e);
        } finally {
            try {
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                log.error("AnalysisFixedPropertiesUtil.downloadProperty.关闭FileOutputStream流失败.e=", e);
            }
        }

        //解压 gz
        File jsonFile = new File(fileName + ".json");
        BufferedOutputStream fos = null;
        try {
            fos = new BufferedOutputStream(new FileOutputStream(jsonFile));
            GZIPInputStream gzin = new GZIPInputStream(new FileInputStream(gzFile));
            int num = -1;
            byte[] buf = new byte[1024];
            while ((num = gzin.read(buf)) != -1) {
                fos.write(buf, 0, num);
            }

            fos.flush();
            gzin.close();
        } catch (IOException e) {
            log.error("AnalysisFixedPropertiesUtil.downloadProperty.解压属性包失败.e=", e);
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    log.error("AnalysisFixedPropertiesUtil.downloadProperty.关闭 BufferedOutputStream 流失败.e=", e);
                }
            }
        }

        gzFile.delete();

        return jsonFile;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值