使用java对json格式化输出

本文介绍了一种将未格式化的JSON字符串转换为易读格式的方法。通过递增和递减缩进级别,此方法能够清晰地展示JSON结构,便于开发者进行调试及验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一些场景需要把json格式化输出,方法本身没有难度,重新发明还要费不少脑筋,记录下来。

public class JsonUtil {

	public static void main(String[] args) {
		//json 字符串
        String s = "{\"code\":10000,\"msg\":null,\"data\":{\"id\":\"7aa0eb56-1026-4497-a42e-4c39f5e3dcf1\",\"topicId\":\"0876ab84-a478-417b-91bc-849843c191a5\",\"title\":null,\"commentId\":null,\"content\":\"" +
                "开发者平台自动化测试:针对帖子发表评论" +
                "\",\"images\":\"\",\"time\":\"2017-10-15 18:09:56\",\"userId\":\"61028f94-de92-4c65-aad3-2fc8614e1d34\",\"userName\":\"devautotest\",\"commentNum\":0,\"status\":0}}";
   
		String out = JsonFormart(s);
		System.out.println(out);
	}
	
	private static String getLevelStr(int level) {
        StringBuffer levelStr = new StringBuffer();
        for (int levelI = 0; levelI < level; levelI++) {
            levelStr.append("\t");
        }
        return levelStr.toString();
    }
	
    public static String JsonFormart(String s) {
        int level = 0;
        //存放格式化的json字符串
        StringBuffer jsonForMatStr = new StringBuffer();
        for(int index=0;index<s.length();index++)//将字符串中的字符逐个按行输出
        {
            //获取s中的每个字符
            char c = s.charAt(index);
//          System.out.println(s.charAt(index));
             
            //level大于0并且jsonForMatStr中的最后一个字符为\n,jsonForMatStr加入\t
            if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
                jsonForMatStr.append(getLevelStr(level));
//                System.out.println("123"+jsonForMatStr);
            }
            //遇到"{"和"["要增加空格和换行,遇到"}"和"]"要减少空格,以对应,遇到","要换行
            switch (c) {
            case '{':
            case '[':
                jsonForMatStr.append(c + "\n");
                level++;
                break;
            case ',':
                jsonForMatStr.append(c + "\n");            
                break;
            case '}':
            case ']':
                jsonForMatStr.append("\n");
                level--;
                jsonForMatStr.append(getLevelStr(level));
                jsonForMatStr.append(c);
                break;
            default:
                jsonForMatStr.append(c);
                break;
            }
        }
        return jsonForMatStr.toString();
    }
}

<think>好的,我现在需要帮助用户了解如何在Java格式化输出JSON。用户之前询问过XML的注释,现在转向JSON格式化,可能是在处理配置文件数据交换相关的开发任务。我需要考虑用户可能的使用场景,比如调试、日志记录或者生成易于阅读的配置文件。 首先,用户可能已经知道JSON的基本结构,但需要更美观的输出格式。Java中常用的库有Jackson、Gson和org.json。我需要介绍这些库的使用方法,并给出具体的示例,确保用户能够直接应用。 接下来,用户可能需要了解不同库之间的区别,比如Jackson和Gson哪个更流行,或者哪个更易于使用。同时,用户可能关心如何在没有第三方库的情况下实现,但这种情况效果有限,需要指出其局限性。 另外,用户可能希望看到具体的代码示例,包括如何配置美化选项,比如缩进和换行。要注意代码注释的清晰,说明每一步的作用。例如,在Jackson中使用enable(SerializationFeature.INDENT_OUTPUT)来启用缩进。 还需要提醒用户注意依赖管理,比如Maven或Gradle的配置,确保他们能正确导入库。同时,提到性能问题,比如在大量数据处理时,美化输出可能会影响性能,建议仅在需要时启用。 最后,总结不同方法的优缺点,帮助用户根据项目需求选择合适的方案。例如,推荐Jackson作为首选,Gson作为替代,而原生方法仅作了解。这样用户可以快速决策,应用到实际开发中。</think>在Java格式化输出JSON的多种方法详解: 1. 使用Jackson库(推荐) ```java // Maven依赖: // com.fasterxml.jackson.core:jackson-databind:2.14.0 ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); // 关键配置 String json = mapper .writerWithDefaultPrettyPrinter() .writeValueAsString(yourObject); ``` 2. Gson库实现方式 ```java // Maven依赖: // com.google.code.gson:gson:2.10 Gson gson = new GsonBuilder() .setPrettyPrinting() // 启用美化 .create(); String json = gson.toJson(yourObject); ``` 3. org.json原生实现 ```java // Maven依赖: // org.json:json:20230618 JSONObject jsonObj = new JSONObject(yourMap); String prettyJson = jsonObj.toString(4); // 缩进4个空格 ``` 4. 无依赖方案(基础处理) ```java String uglyJson = "{\"name\":\"John\",\"age\":30}"; String prettyJson = uglyJson .replace("{", "{\n ") .replace(",", ",\n ") .replace("}", "\n}"); // 简单格式化,适用简单结构 ``` 5. 格式化对比示例 输入对象: ```java Map<String, Object> data = new HashMap<>(); data.put("name", "张三"); data.put("age", 25); data.put("skills", Arrays.asList("Java", "Python")); ``` 格式化输出结果: ```json { "name" : "张三", "age" : 25, "skills" : [ "Java", "Python" ] } ``` 重要注意事项: 1. 性能影响:格式化会增加约20%-30%的处理时间(根据数据量) 2. 依赖选择: - Jackson:功能最全面,Spring生态默认集成 - Gson:Google出品,Android开发常用 3. 特殊配置: ```java // Jackson日期格式化 mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); // Gson空值处理 new GsonBuilder().serializeNulls(); ``` 最佳实践建议: - 生产环境建议关闭格式化以提升性能 - 调试时配合日志框架使用: ```java logger.debug("JSON数据:\n{}", prettyJson); ``` - 复杂结构处理推荐使用Jackson的JsonNode: ```java JsonNode node = mapper.readTree(jsonString); String formatted = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(node); ``` 扩展方案:使用JSON5规范(支持注释等扩展语法) ```java // 需要引入第三方库如:com.github.simplesteph.ksk:json5:1.0 JSON5Object obj = new JSON5Object(data); String json5 = obj.toJSON5String(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值