Java生成并导出Json文件

news/2024/11/9 20:42:05 标签: Java, Json文件

将一个list集合转换成json文件并导出:

复制代码

     
数据集合:
    List<Object> agencyList = new ArrayList<Object>();
        Map<String, Object> agencyMap = new HashMap<>();
        agencyMap.put("agencyName",agencyName);
        agencyMap.put("agencyAddress", agencyAddress);
        agencyMap.put("companyName", companyName);
        agencyMap.put("logoImageId", logoImageId);
        agencyMap.put("auctionAddress", agencyAuctionAddress);
        agencyMap.put("logoImage", logoImage);
        agencyList.add(agencyMap);

复制代码

 

    
将集合数据转换为json字符串(当然map集合亦可以):
     JSONArray jsonObject = JSONArray.fromObject(agencyList);
        String jsonString1 = jsonObject.toString();
        CreateFileUtil.createJsonFile(jsonString1, "/fileStorage/download/json", "agency");

 

复制代码

public class CreateFileUtil {
    /**
     * 生成.json格式文件
     */
    public static boolean createJsonFile(String jsonString, String filePath, String fileName) {
        // 标记文件生成是否成功
        boolean flag = true;

        // 拼接文件完整路径
        String fullPath = filePath + File.separator + fileName + ".json";

        // 生成json格式文件
        try {
            // 保证创建一个新文件
            File file = new File(fullPath);
            if (!file.getParentFile().exists()) { // 如果父目录不存在,创建父目录
                file.getParentFile().mkdirs();
            }
            if (file.exists()) { // 如果已存在,删除旧文件
                file.delete();
            }
            file.createNewFile();

            if(jsonString.indexOf("'")!=-1){  
                //将单引号转义一下,因为JSON串中的字符串类型可以单引号引起来的  
                jsonString = jsonString.replaceAll("'", "\\'");  
            }  
            if(jsonString.indexOf("\"")!=-1){  
                //将双引号转义一下,因为JSON串中的字符串类型可以单引号引起来的  
                jsonString = jsonString.replaceAll("\"", "\\\"");  
            }  
              
            if(jsonString.indexOf("\r\n")!=-1){  
                //将回车换行转换一下,因为JSON串中字符串不能出现显式的回车换行  
                jsonString = jsonString.replaceAll("\r\n", "\\u000d\\u000a");  
            }  
            if(jsonString.indexOf("\n")!=-1){  
                //将换行转换一下,因为JSON串中字符串不能出现显式的换行  
                jsonString = jsonString.replaceAll("\n", "\\u000a");  
            }  
            
            // 格式化json字符串
            jsonString = JsonFormatTool.formatJson(jsonString);

            // 将格式化后的字符串写入文件
            Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
            write.write(jsonString);
            write.flush();
            write.close();
        } catch (Exception e) {
            flag = false;
            e.printStackTrace();
        }

        // 返回是否成功的标记
        return flag;
    }
       
}

复制代码

 

 

复制代码

public class JsonFormatTool {
    /**
     * 单位缩进字符串。
     */
    private static String SPACE = "   ";

    /**
     * 返回格式化JSON字符串。
     * 
     * @param json 未格式化的JSON字符串。
     * @return 格式化的JSON字符串。
     */
    public static String formatJson(String json) {
        StringBuffer result = new StringBuffer();

        int length = json.length();
        int number = 0;
        char key = 0;

        // 遍历输入字符串。
        for (int i = 0; i < length; i++) {
            // 1、获取当前字符。
            key = json.charAt(i);

            // 2、如果当前字符是前方括号、前花括号做如下处理:
            if ((key == '[') || (key == '{')) {
                // (1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
                if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
                    result.append('\n');
                    result.append(indent(number));
                }

                // (2)打印:当前字符。
                result.append(key);

                // (3)前方括号、前花括号,的后面必须换行。打印:换行。
                result.append('\n');

                // (4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
                number++;
                result.append(indent(number));

                // (5)进行下一次循环。
                continue;
            }

            // 3、如果当前字符是后方括号、后花括号做如下处理:
            if ((key == ']') || (key == '}')) {
                // (1)后方括号、后花括号,的前面必须换行。打印:换行。
                result.append('\n');

                // (2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
                number--;
                result.append(indent(number));

                // (3)打印:当前字符。
                result.append(key);

                // (4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
                if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
                    result.append('\n');
                }

                // (5)继续下一次循环。
                continue;
            }

            // 4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
            /*if ((key == ',')) {
                result.append(key);
                result.append('\n');
                result.append(indent(number));
                continue;
            }*/

            // 5、打印:当前字符。
            result.append(key);
        }

        return result.toString();
    }

    /**
     * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
     * 
     * @param number 缩进次数。
     * @return 指定缩进次数的字符串。
     */
    private static String indent(int number) {
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < number; i++) {
            result.append(SPACE);
        }
        return result.toString();
    }
}

复制代码

 

 

 

当然其中涉及到转义字符处理的问题。


http://www.niftyadmin.cn/n/1639137.html

相关文章

使用JST模板引擎加快页面交互内容开发

首先看一个需求&#xff1a; 页面上存在一个select box&#xff0c;当选择了下拉框中的一个选项的时候&#xff0c;异步请求获取数据并在页面某个区域显示出来。而且这个显示区域是具有样式和自己固有的js等内容的&#xff0c;并非简单的静态文字。 如果用传统的js方式&#x…

[前端控件开发]freemarker框架下编写自己的分页器

对于web系统来说&#xff0c;分页器就好像是一个器官&#xff0c;是无论如何都必须要具备的一项功能&#xff0c;而分页器呢&#xff0c;是既通用又无怪乎那么几种样子&#xff0c;所以我们这里就利用添加了freemarker框架的一个系统来做自己的分页器。先看下结果样子&#xff…

优化Elasticsearch查询性能

给文件系统缓存提供内存 Elasticsearch严重依赖于文件系统缓存&#xff0c;以便快速进行搜索。 通常应该确保至少有一半的可用内存进入文件系统缓存&#xff0c;以便Elasticsearch可以将索引的热区域保留在物理内存中。 使用更快的硬件 如果搜索受I / O限制&#xff0c;应该调…

[小插曲]spring+freemarker中文乱码了,囧

spring freemarker 中文乱码了&#xff0c;其实是配置的时候粗心忘了配置viewResolver的编码&#xff0c;只配置了freeMarkerConfigurer的default-coding。 配置一下即可&#xff1a; <bean id"freeMarkerConfigurer"class"org.springframework.web.servlet…

Elasticsearch的Bulk API使用

1、Elasticsearch的Bulk API允许批量提交index和delete请求。如&#xff1a; &#xff08;1&#xff09;用法1 BulkRequestBuilder bulkRequest client.prepareBulk(); bulkRequest.add(client.prepareIndex("index1", "type1", "id1").setSou…

[HeadFirst]观察者模式 - 老王跳灰机的故事

写博客&#xff0c;看博客&#xff0c;要的是直接进入主题&#xff0c;不要太多的前戏&#xff0c;否则读者看着看着就没了兴趣。 所以直接看设计模式-观察者模式的图示介绍&#xff1a; 所谓的主题&#xff0c;即被观者的对象&#xff0c;当这个对象发生变化的时候&#xff0…

Elasticsearch批量索引和删除

批量索引和删除 Java代码 收藏代码 BulkRequestBuilder bulkRequest client.prepareBulk(); for(int i500;i<1000;i){ //业务对象 String json ESUtils.toJson(new LogModel()); IndexRequestBuilder indexReques…

[Memcache] 初探Memcache

Memcache (http://memcached.org/) memcache 是一种分布式缓存服务器&#xff0c;和通常使用的非分布式的ecache不同&#xff0c;memcache需要独立的服务器支撑&#xff0c;客户端通过配置IP地址和端口号&#xff08;默认11211&#xff09;与之连接并使用API进行数据的缓存操作…