json中date(JSONObject)引发的血案

素颜马尾好姑娘i 2022-04-01 04:50 855阅读 0赞

前言

1、测试bean

1、包含集合的测试bean

  1. package com.hlj.data.res.test;
  2. import io.swagger.annotations.ApiModel;
  3. import lombok.Data;
  4. import lombok.experimental.Accessors;
  5. import java.math.BigDecimal;
  6. import java.util.Date;
  7. import java.util.List;
  8. /** * @Desc: json测试实体 * @Author HealerJean * @Date 2018/9/25 上午11:10. * */
  9. @Data
  10. @Accessors(chain = true)
  11. @ApiModel (description = "json测试实体")
  12. public class TsJsonData {
  13. /** {"error":"0","msg":"操作成功","data":[{"n_long":"3923600074","n_string":"小当","n_bigDecimal":"5.9000","n_date":"2018-12-13 20:31:04","n_integer":1},{"n_long":"3923600074","n_string":"小当","n_bigDecimal":"5.9000","n_date":"2018-12-13 20:31:04","n_integer":1}]} * error : 0 * msg : 操作成功 * data : [{"n_long":"3923600074","n_string":"小当","n_bigDecimal":"5.9000","n_date":"2018-12-13 20:31:04","n_integer":1},{"n_long":"3923600074","n_string":"小当","n_bigDecimal":"5.9000","n_date":"2018-12-13 20:31:04","n_integer":1}] */
  14. private String error;
  15. private String msg;
  16. private List<DataBean> data;
  17. @Data
  18. @Accessors(chain = true)
  19. public static class DataBean {
  20. /** * n_long : 3923600074 * n_string : name * n_bigDecimal : 5.9000 * n_date : 2018-12-13 20:31:04 * income_rate : 0.9000 * n_integer : 1 */
  21. private Long n_long;
  22. private String n_string;
  23. private BigDecimal n_bigDecimal;
  24. private Date n_date;
  25. private Integer n_integer;
  26. }
  27. }

2、普通Bean

  1. package com.hlj.data.res.test;
  2. import lombok.Data;
  3. import lombok.experimental.Accessors;
  4. import java.io.Serializable;
  5. import java.math.BigDecimal;
  6. import java.util.Date;
  7. /** * 作者 :HealerJean * 日期 :2018/12/14 下午7:56. * 类描述: */
  8. @Data
  9. @Accessors(chain = true)
  10. public class JavaBean implements Serializable {
  11. private Long n_long;
  12. private String n_string;
  13. private BigDecimal n_bigDecimal;
  14. private Date n_date;
  15. private Integer n_integer;
  16. }

3、不返回null的bean

  1. package com.hlj.data.res.test;
  2. import com.fasterxml.jackson.annotation.JsonInclude;
  3. import lombok.Data;
  4. import lombok.experimental.Accessors;
  5. import java.math.BigDecimal;
  6. import java.util.Date;
  7. /** * 作者 :HealerJean * 日期 :2018/12/28 下午7:36. * 类描述: */
  8. @Data
  9. @Accessors(chain = true)
  10. @JsonInclude(JsonInclude.Include.NON_NULL)
  11. public class IncludeJavaBean {
  12. private Long n_long;
  13. private String n_string;
  14. private BigDecimal n_bigDecimal;
  15. private Date n_date;
  16. private Integer n_integer;
  17. }

2、开始正儿八经测试

3.0、准备假数据

  1. /** * 假数据JavaBean * @return */
  2. private JavaBean getJavaBean() {
  3. JavaBean javaBean = new JavaBean();
  4. javaBean.setN_long(10045456456L);
  5. javaBean.setN_bigDecimal(new BigDecimal("12.12245"));
  6. javaBean.setN_date(new Date());
  7. javaBean.setN_integer(100);
  8. javaBean.setN_string("HealerJean");
  9. return javaBean;
  10. }
  11. /** * 假数据JavaBean 对应的 Map * @return */
  12. private Map<String, Object> getJavaBeanMap() {
  13. Map<String, Object> map = new HashMap<>();
  14. map.put("n_long", 10045456456L);
  15. map.put("n_string", "张宇晋");
  16. map.put("n_bigDecimal",new BigDecimal("12.12245") );
  17. map.put("n_date",new Date() );
  18. map.put("n_integer",100 );
  19. return map;
  20. }
  21. /** * 假数据 IncludeJavaBean 用于测试 include.not_null * @return */
  22. private IncludeJavaBean getIncludeJavaBean() {
  23. IncludeJavaBean includeJavaBean = new IncludeJavaBean();
  24. includeJavaBean.setN_long(10045456456L);
  25. includeJavaBean.setN_bigDecimal(new BigDecimal("12.12245"));
  26. includeJavaBean.setN_date(null);
  27. includeJavaBean.setN_integer(100);
  28. /** * 下面和这个设置为null */
  29. includeJavaBean.setN_string(null);
  30. return includeJavaBean;
  31. }

3.1、date类型必须是long

3.2、JSONObcjet不可以随便使用,和对象一起用的时候,会将date变质

3.3、强烈要求使用objectMapper

  1. /** * 一、 * 1、date类型不是long是错误的,不能转化成果 * 2、如果将有date参数的对象 通过JSONObject 打印成String字符串,则,date会变质,不会变成long类型的了,如下 * 但是需要注意的是,这其实只要不转化出String来,这些对象都是可以操作的,不受影响 * * JSONObject.fromObject(tsJsonData).toString() * 3、通过objectMapper的转化,一切正常 ,如下 * JsonUtils.toJson(tsJsonData) */
  2. @Test
  3. public void JsonObjectForJsonToBean(){
  4. // 1、错误的,转化直接报错 String jsonDataStr = "{\"error\":\"0\",\"msg\":\"操作成功\",\"data\":[{\"n_long\":\"3923600074\",\"n_string\":\"小当\",\"n_bigDecimal\":\"5.9000\",\"n_date\":\"2018-12-13 20:31:04\",\"n_integer\":1},{\"n_long\":\"3923600074\",\"n_string\":\"小当\",\"n_bigDecimal\":\"5.9000\",\"n_date\":\"2018-12-13 20:31:04\",\"n_integer\":1}]}";
  5. String jsonDataStr = "{\"error\":\"0\",\"msg\":\"操作成功\",\"data\":[{\"n_long\":\"3923600074\",\"n_string\":\"小当\",\"n_bigDecimal\":\"5.9000\",\"n_date\":\"1544782308409\",\"n_integer\":1},{\"n_long\":\"3923600074\",\"n_string\":\"小当\",\"n_bigDecimal\":\"5.9000\",\"n_date\":\"1544782308409\",\"n_integer\":1}]}";
  6. log.info("\n1、JsonObjectForJsonToBean\n"+JSONObject.fromObject(jsonDataStr).toString());
  7. //打印结果:正常,因为没有经过对象中date变质
  8. // {"error":"0","msg":"操作成功","data":[{"n_long":"3923600074","n_string":"小当","n_bigDecimal":"5.9000","n_date":"1544782308409","n_integer":1},{"n_long":"3923600074","n_string":"小当","n_bigDecimal":"5.9000","n_date":"1544782308409","n_integer":1}]}
  9. //2、JSONObject将具有date的对象进行洗礼
  10. TsJsonData tsJsonData = JsonUtils.toObject(jsonDataStr, TsJsonData.class );
  11. log.info("\n2、JsonObjectForJsonToBean\n"+JSONObject.fromObject(tsJsonData).toString());
  12. //打印结果:date变质了哦
  13. //{"data":[{"n_bigDecimal":5.9,"n_date":{"date":14,"day":5,"hours":18,"minutes":11,"month":11,"seconds":48,"time":1544782308409,"timezoneOffset":-480,"year":118},"n_integer":1,"n_long":3923600074,"n_string":"小当"},{"n_bigDecimal":5.9,"n_date":{"date":14,"day":5,"hours":18,"minutes":11,"month":11,"seconds":48,"time":1544782308409,"timezoneOffset":-480,"year":118},"n_integer":1,"n_long":3923600074,"n_string":"小当"}],"error":"0","msg":"操作成功"}
  14. //3、通过objectMapper的转化
  15. log.info("\n3、JsonObjectForJsonToBean\n"+JsonUtils.toJson(tsJsonData));
  16. //打印结果: 一切正常
  17. //{"error":"0","msg":"操作成功","data":[{"n_long":3923600074,"n_string":"小当","n_bigDecimal":5.9000,"n_date":1544782308409,"n_integer":1},{"n_long":3923600074,"n_string":"小当","n_bigDecimal":5.9000,"n_date":1544782308409,"n_integer":1}]}
  18. }

3.3、JavaBean转map

  1. /** 二.1 * JavaBean转Map * 用法:可以用于Http map传参 */
  2. @Test
  3. public void baenToMap() {
  4. JavaBean javaBean = getJavaBean();
  5. Map<String, Object> map = (Map<String, Object>)JSONObject.fromObject(javaBean);
  6. log.info("\nbaenToMap\n"+JsonUtils.toJson(map));
  7. //下面这里发现date 变质了,但是map还是可以操作的,只是不要将它转化为string字符串,并且将它输出到前台也是正常的long类型的Json数据哦
  8. //{"n_bigDecimal":12.12245,"n_date":{"date":14,"day":5,"hours":20,"minutes":0,"month":11,"seconds":31,"time":1544788831913,"timezoneOffset":-480,"year":118},"n_integer":100,"n_long":10045456456,"n_string":"张宇晋"}
  9. Map<String, Object> map2= JsonUtils.toObject(JsonUtils.toJson(javaBean),new TypeReference<Map<String, Object>>( ){ } );
  10. log.info(JsonUtils.toJson(map2));
  11. //正常
  12. //{"n_long":10045456456,"n_string":"HealerJean","n_bigDecimal":12.12245,"n_date":1546053984277,"n_integer":100}
  13. }

3.3.2、将变质的日期输出到前台

  1. @GetMapping("getMapHaveDateFalse")
  2. @ResponseBody
  3. public Map<String ,Object> getMap(){
  4. JavaBean javaBean = getJavaBean();
  5. Map<String, Object> map = (Map<String, Object>) JSONObject.fromObject(javaBean);
  6. return map ;
  7. }

3.4、Map转javabean

  1. /** * 二.2 * Map转JavaBean */
  2. @Test
  3. public void MapTobaen() {
  4. Map<String, Object> map = getJavaBeanMap();
  5. // String mapStr = JSONObject.fromObject(map).toString();
  6. //1、 打印结果:date变质
  7. //{"n_date":{"date":28,"day":5,"hours":19,"minutes":22,"month":11,"seconds":56,"time":1545996176773,"timezoneOffset":-480,"year":118},"n_integer":100,"n_bigDecimal":12.12245,"n_string":"张宇晋","n_long":10045456456}
  8. String mapStr = JsonUtils.toJson(map);
  9. log.info("\nMapTobaen\n"+mapStr);
  10. //2、正常,所以不要使用 JSONObject
  11. //{"n_date":1545996089637,"n_integer":100,"n_bigDecimal":12.12245,"n_string":"张宇晋","n_long":10045456456}
  12. }

3.5、@JsonInclude(JsonInclude.Include.NON_NULL)

  1. /** * Jsoninclude.NOT_NULL */
  2. @Test
  3. public void JSONInclude(){
  4. //n_string 字段为null date字段为null
  5. IncludeJavaBean includeJavaBean = getIncludeJavaBean() ;
  6. //1、经过ObjectMapper处理
  7. log.info("\nJSONInclude\n"+JsonUtils.toJson(includeJavaBean));
  8. //打印结果:正常 使用了上面的注解,下面如果是null则不会出现 该字段
  9. //{"n_long":10045456456,"n_bigDecimal":12.12245,"n_integer":100}
  10. //2、如果是经过 JSONObject.fromObject ,
  11. // null的字段会变成 空字符串"" ,
  12. // 日期为空,则会变成null ,所以谨慎使用
  13. log.info("\nJSONObject.fromObject(includeJavaBean).toString()\n"+JSONObject.fromObject(includeJavaBean).toString());
  14. //打印结果:
  15. // {"n_bigDecimal":12.12245,"n_date":null,"n_integer":100,"n_long":10045456456,"n_string":""}
  16. /** * json转对象 */
  17. String jsonNull = "{\"n_long\":10045456456,\"n_bigDecimal\":12.12245,\"n_integer\":100}" ;
  18. String jsonPramsNull = "{\"n_bigDecimal\":12.12245,\"n_date\":null,\"n_integer\":100,\"n_long\":10045456456,\"n_string\":\"\"}" ;
  19. IncludeJavaBean mapperjavaBean =JsonUtils.toObject(jsonNull,IncludeJavaBean.class );
  20. //不存在显示 null
  21. //IncludeJavaBean(n_long=10045456456, n_string=null, n_bigDecimal=12.12245, n_date=null, n_integer=100)
  22. IncludeJavaBean mapperParamsNulljavaBean =JsonUtils.toObject(jsonPramsNull,IncludeJavaBean.class );
  23. //空字符串显示 "" null表示null
  24. //IncludeJavaBean(n_long=10045456456, n_string=, n_bigDecimal=12.12245, n_date=null, n_integer=100)
  25. //下面二者同上
  26. IncludeJavaBean javaBean = JsonUtils.toObject(JSONObject.fromObject(jsonNull).toString(), IncludeJavaBean.class);
  27. //IncludeJavaBean(n_long=10045456456, n_string=null, n_bigDecimal=12.12245, n_date=null, n_integer=100)
  28. IncludeJavaBean javaParamsNullBean = JsonUtils.toObject(JSONObject.fromObject(jsonPramsNull).toString(), IncludeJavaBean.class);
  29. //IncludeJavaBean(n_long=10045456456, n_string=, n_bigDecimal=12.12245, n_date=null, n_integer=100)
  30. System.out.println(mapperjavaBean.toString());
  31. System.out.println(mapperParamsNulljavaBean.toString());
  32. System.out.println(javaBean.toString());
  33. System.out.println(javaParamsNullBean.toString());
  34. }

3.6、json转化为list集合

  1. /** * json转化为数组 */
  2. @Test
  3. public void JsonToList(){
  4. List<JavaBean> javaBeans = new ArrayList<>();
  5. JavaBean javaBean1 = getJavaBean();
  6. JavaBean javaBean2 = getJavaBean();
  7. javaBeans.add(javaBean1);
  8. javaBeans.add(javaBean2);
  9. //list转化为string字符串,这里可别用JSONObject了,这个家伙太完蛋,一下子就会将date变质
  10. String jsonArrayStr = JsonUtils.toJson(javaBeans);
  11. log.info("\nJsonUtils.toJson(jsonArrayStr)\n"+jsonArrayStr);
  12. //打印结果 正常打印
  13. // [{"n_long":10045456456,"n_string":"HealerJean","n_bigDecimal":12.12245,"n_date":1546051110172,"n_integer":100},{"n_long":10045456456,"n_string":"HealerJean","n_bigDecimal":12.12245,"n_date":1546051110172,"n_integer":100}]
  14. //2、转化为数组
  15. List<JavaBean> lendReco = JsonUtils.toObject(jsonArrayStr, new TypeReference<List<JavaBean>>() { });
  16. String lendRecoStr = JsonUtils.toJson(lendReco);
  17. System.out.println(lendRecoStr);
  18. //打印结果 正常打印
  19. //[{"n_long":10045456456,"n_string":"HealerJean","n_bigDecimal":12.12245,"n_date":1546052196927,"n_integer":100},{"n_long":10045456456,"n_string":"HealerJean","n_bigDecimal":12.12245,"n_date":1546052196927,"n_integer":100}]
  20. //第一种方式,只针对没有使用lombok注解的情况 ,这种方式不论有没有 date类型 使用了@Data注解 就会出现下面的问题,
  21. // 有了date那也肯定的会是这种结局 ,
  22. // 使用的时候下面这种的时候,不要用@Data注解,所以以后就不要使用了,jsonArray来源需要是原生的
  23. // javaBeans = JSONArray.toList(jsonArray,new JavaBean() ,new JsonConfig());
  24. // net.sf.json.JSONObject - Property 'n_bigDecimal' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  25. // 2018-12-14 20:27:08.129 [main] INFO net.sf.json.JSONObject - Property 'n_date' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  26. // 2018-12-14 20:27:08.130 [main] INFO net.sf.json.JSONObject - Property 'n_integer' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  27. // 2018-12-14 20:27:08.130 javaBeans[main] INFO net.sf.json.JSONObject - Property 'n_long' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  28. // 2018-12-14 20:27:08.130 [main] INFO net.sf.json.JSONObject - Property 'n_string' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  29. // 2018-12-14 20:27:08.130 [main] INFO net.sf.json.JSONObject - Property 'n_bigDecimal' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  30. // 2018-12-14 20:27:08.130 [main] INFO net.sf.json.JSONObject - Property 'n_date' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  31. // 2018-12-14 20:27:08.131 [main] INFO net.sf.json.JSONObject - Property 'n_integer' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  32. // 2018-12-14 20:27:08.131 [main] INFO net.sf.json.JSONObject - Property 'n_long' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  33. // 2018-12-14 20:27:08.131 [main] INFO net.sf.json.JSONObject - Property 'n_string' of class com.hlj.data.res.test.JavaBean has no write method. SKIPPED.
  34. }

3、工具类

  1. package com.hlj.utils;
  2. import com.fasterxml.jackson.core.JsonGenerationException;
  3. import com.fasterxml.jackson.core.JsonParseException;
  4. import com.fasterxml.jackson.core.JsonProcessingException;
  5. import com.fasterxml.jackson.core.type.TypeReference;
  6. import com.fasterxml.jackson.databind.*;
  7. import com.fasterxml.jackson.databind.type.TypeFactory;
  8. import net.sf.json.JSONArray;
  9. import net.sf.json.JSONObject;
  10. import net.sf.json.util.JSONTokener;
  11. import org.springframework.util.Assert;
  12. import java.io.IOException;
  13. import java.io.Writer;
  14. import java.lang.reflect.Type;
  15. /** * Utils - JSON */
  16. public final class JsonUtils {
  17. /** * ObjectMapper */
  18. private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
  19. static {
  20. // jackson 1.9 and before
  21. //objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  22. // or jackson 2.0
  23. OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  24. }
  25. public static ObjectMapper getObjectMapper() {
  26. return OBJECT_MAPPER;
  27. }
  28. /** * 不可实例化 */
  29. private JsonUtils() {
  30. }
  31. /** * 将对象转换为JSON字符串 * * @param value 对象 * @return JSON字符串 */
  32. public static String toJson(Object value) {
  33. Assert.notNull(value, "json 不允许为空");
  34. try {
  35. return OBJECT_MAPPER.writeValueAsString(value);
  36. } catch (JsonProcessingException e) {
  37. throw new RuntimeException(e.getMessage(), e);
  38. }
  39. }
  40. /** * 将JSON字符串转换为对象 * * @param json JSON字符串 * @param valueType 类型 * @return 对象 */
  41. public static <T> T toObject(String json, Class<T> valueType) {
  42. Assert.hasText(json, "json 不允许为空");
  43. Assert.notNull(valueType, "valueType 不允许为空");
  44. try {
  45. return OBJECT_MAPPER.readValue(json, valueType);
  46. } catch (JsonParseException e) {
  47. throw new RuntimeException(e.getMessage(), e);
  48. } catch (JsonMappingException e) {
  49. throw new RuntimeException(e.getMessage(), e);
  50. } catch (IOException e) {
  51. throw new RuntimeException(e.getMessage(), e);
  52. }
  53. }
  54. /** * 将JSON字符串转换为对象 * * @param json JSON字符串 * @param typeReference 类型 可以通过这个转化为List集合 ,举例: * List<JavaBean> list = JsonUtils.toObject(jsonArrayStr, new TypeReference<List<JavaBean>>() { }); * Map<String, Object> map = JsonUtils.toObject(JsonUtils.toJson(javaBean),new TypeReference<Map<String, Object>>( ){} ); * @return 对象 */
  55. public static <T> T toObject(String json, TypeReference<?> typeReference) {
  56. Assert.hasText(json, "json 不允许为空");
  57. Assert.notNull(typeReference, "typeReference 不允许为空");
  58. try {
  59. return OBJECT_MAPPER.readValue(json, typeReference);
  60. } catch (JsonParseException e) {
  61. throw new RuntimeException(e.getMessage(), e);
  62. } catch (JsonMappingException e) {
  63. throw new RuntimeException(e.getMessage(), e);
  64. } catch (IOException e) {
  65. throw new RuntimeException(e.getMessage(), e);
  66. }
  67. }
  68. /** * 将JSON字符串转换为对象 * * @param json JSON字符串 * @param javaType 类型 * @return 对象 */
  69. public static <T> T toObject(String json, JavaType javaType) {
  70. Assert.hasText(json, "json 不允许为空");
  71. Assert.notNull(javaType, "javaType 不允许为空");
  72. try {
  73. return OBJECT_MAPPER.readValue(json, javaType);
  74. } catch (JsonParseException e) {
  75. throw new RuntimeException(e.getMessage(), e);
  76. } catch (JsonMappingException e) {
  77. throw new RuntimeException(e.getMessage(), e);
  78. } catch (IOException e) {
  79. throw new RuntimeException(e.getMessage(), e);
  80. }
  81. }
  82. /** * 将JSON字符串转换为树 * * @param json JSON字符串 * @return 树 */
  83. public static JsonNode toTree(String json) {
  84. Assert.hasText(json, "json 不允许为空");
  85. try {
  86. return OBJECT_MAPPER.readTree(json);
  87. } catch (JsonProcessingException e) {
  88. throw new RuntimeException(e.getMessage(), e);
  89. } catch (IOException e) {
  90. throw new RuntimeException(e.getMessage(), e);
  91. }
  92. }
  93. /** * 将对象转换为JSON流 * * @param writer Writer * @param value 对象 */
  94. public static void writeValue(Writer writer, Object value) {
  95. Assert.notNull(writer, "writer 不允许为空");
  96. Assert.notNull(value, "value 不允许为空");
  97. try {
  98. OBJECT_MAPPER.writeValue(writer, value);
  99. } catch (JsonGenerationException e) {
  100. throw new RuntimeException(e.getMessage(), e);
  101. } catch (JsonMappingException e) {
  102. throw new RuntimeException(e.getMessage(), e);
  103. } catch (IOException e) {
  104. throw new RuntimeException(e.getMessage(), e);
  105. }
  106. }
  107. /** * 判断是jsonobject还是jsonArrsy * 如果是jsonObject则是1 * 如果是jsonArrsy 则是2 * 如果二者都不是则返回0 * @param json * @return */
  108. public Integer judgeJson(String json){
  109. Assert.hasText(json, "json 不允许为空");
  110. Object jsonT = new JSONTokener(json).nextValue();
  111. if(jsonT instanceof JSONObject){
  112. return 1;
  113. }else if (jsonT instanceof JSONArray) {
  114. return 2 ;
  115. }else {
  116. return 0;
  117. }
  118. }
  119. /** * 构造类型 * @param type 类型,类,接口,枚举字段类型 (java.class) * @return 类型 */
  120. public static JavaType constructType(Type type) {
  121. Assert.notNull(type, "type 不允许为空");
  122. return TypeFactory.defaultInstance().constructType(type);
  123. }
  124. /** * 构造类型 * @param typeReference 类型 new TypeReference<List<JavaBean>>() { } * @return 类型 */
  125. public static JavaType constructType(TypeReference<?> typeReference) {
  126. Assert.notNull(typeReference, "typeReference 不允许为空");
  127. return TypeFactory.defaultInstance().constructType(typeReference);
  128. }
  129. /** * @param resString * @return String * @Description Json 格式化到控制台打印 * */
  130. public static String responseFormat(String resString){
  131. StringBuffer jsonForMatStr = new StringBuffer();
  132. int level = 0;
  133. for(int index=0;index<resString.length();index++)//将字符串中的字符逐个按行输出
  134. {
  135. //获取s中的每个字符
  136. char c = resString.charAt(index);
  137. //level大于0并且jsonForMatStr中的最后一个字符为\n,jsonForMatStr加入\t
  138. if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
  139. jsonForMatStr.append(getLevelStr(level));
  140. }
  141. //遇到"{"和"["要增加空格和换行,遇到"}"和"]"要减少空格,以对应,遇到","要换行
  142. switch (c) {
  143. case '{':
  144. case '[':
  145. jsonForMatStr.append(c + "\n");
  146. level++;
  147. break;
  148. case ',':
  149. jsonForMatStr.append(c + "\n");
  150. break;
  151. case '}':
  152. case ']':
  153. jsonForMatStr.append("\n");
  154. level--;
  155. jsonForMatStr.append(getLevelStr(level));
  156. jsonForMatStr.append(c);
  157. break;
  158. default:
  159. jsonForMatStr.append(c);
  160. break;
  161. }
  162. }
  163. return jsonForMatStr.toString();
  164. }
  165. /** * @param level * @return * @throws * @author lgh * @date 2018/10/29-14:29 */
  166. private static String getLevelStr(int level) {
  167. StringBuffer levelStr = new StringBuffer();
  168. for (int levelI = 0; levelI < level; levelI++) {
  169. levelStr.append("\t");
  170. }
  171. return levelStr.toString();
  172. }
  173. }

感兴趣的,欢迎添加博主微信,

哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。

请下方留言吧。可与博主自由讨论哦
















微信 微信公众号 支付宝
微信 微信公众号 支付宝

发表评论

表情:
评论列表 (有 0 条评论,855人围观)

还没有评论,来说两句吧...

相关阅读

    相关 参数名引发血案

    概况 今天在解决一个Bug时,修改了原先的SQL语句,在数据库执行通过之后,复制到了项目中,使用MyBatis进行查询,却屡屡报错,现在把解决问题的过程记下来 报错信

    相关 一个“-”引发血案

    也许你永远遇不到这样的bug的,但是你要知道什么bug都有,所以不要惊讶! 简化场景: 拼接了这样一个字符串:1.2,2.3,0.4-flag(三个double值用逗

    相关 12 Json数据引发血案

    Json 数据可真是大红大紫一番,它实在是太容易理解了,随着 Js 的火爆它就更加『肆无忌惮』起来。我们在 Java/Kotlin 当中解析它的时候经常会用到 Gson 这个库