JsonUtil.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package api.common.util;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.core.type.TypeReference;
  4. import com.fasterxml.jackson.databind.DeserializationFeature;
  5. import com.fasterxml.jackson.databind.JavaType;
  6. import com.fasterxml.jackson.databind.JsonNode;
  7. import com.fasterxml.jackson.databind.ObjectMapper;
  8. import com.fasterxml.jackson.databind.node.TextNode;
  9. import com.fasterxml.jackson.databind.type.TypeFactory;
  10. import lombok.SneakyThrows;
  11. import java.util.ArrayList;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. import java.util.regex.Matcher;
  16. import java.util.regex.Pattern;
  17. public class JsonUtil {
  18. private static final ObjectMapper mapper = new ObjectMapper();
  19. /**
  20. * 获取指定字段的值
  21. *
  22. * @param json json 字符串
  23. * @param location 定位字符串 xx.xx.xx,数组元素用数字选择
  24. * @return 指定字段的值
  25. */
  26. public static String getString(String json, String location) {
  27. try {
  28. ObjectMapper objectMapper = new ObjectMapper();
  29. JsonNode jsonNode = objectMapper.readTree(json);
  30. for (String element : location.split("\\.")) {
  31. if (jsonNode.isArray()) {
  32. jsonNode = jsonNode.path(Integer.parseInt(element));
  33. } else {
  34. jsonNode = jsonNode.path(element);
  35. }
  36. }
  37. //此处需使用toString,asText只能在最后一级使用,否则值为null,同时需要注意去掉双引号
  38. return jsonNode.toString();
  39. } catch (JsonProcessingException e) {
  40. throw new RuntimeException(e);
  41. }
  42. }
  43. /**
  44. * bean 转成 json
  45. *
  46. * @param bean bean 对象
  47. * @param <T> 声明为泛型方法
  48. * @return json 字符串
  49. */
  50. public static <T> String beanToJson(T bean) {
  51. try {
  52. return new ObjectMapper().writeValueAsString(bean);
  53. } catch (JsonProcessingException e) {
  54. throw new RuntimeException(e);
  55. }
  56. }
  57. /**
  58. * json 转成 bean
  59. *
  60. * @param json json 字符串
  61. * @param tClass 返回值类型
  62. * @param <T> 声明为泛型方法
  63. * @return bean 对象
  64. */
  65. @SneakyThrows
  66. public static <T> T jsonToBean(String json, Class<T> tClass) {
  67. ObjectMapper objectMapper = new ObjectMapper();
  68. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  69. return objectMapper.readValue(json, tClass);
  70. }
  71. /**
  72. * bean 转成 json
  73. *
  74. * @param list 列表对象
  75. * @param <T> 声明为泛型方法
  76. * @return json 字符串
  77. * @throws JsonProcessingException 异常
  78. */
  79. public static <T> String listToJson(T list) throws JsonProcessingException {
  80. return new ObjectMapper().writeValueAsString(list);
  81. }
  82. public static <T> List<T> jsonToList(String json, Class<T> tClass) {
  83. try {
  84. JavaType javaType = TypeFactory.defaultInstance().constructParametricType(List.class, tClass);
  85. if (ObjectUtil.isNull(json)) {
  86. return new ArrayList<>();
  87. }
  88. return new ObjectMapper().readValue(json, javaType);
  89. } catch (JsonProcessingException e) {
  90. throw new RuntimeException(e);
  91. }
  92. }
  93. /**
  94. * bean 转成 json
  95. *
  96. * @param <T> 声明为泛型方法
  97. * @return json 字符串
  98. */
  99. public static <T> List<T> jsonToCommonList(String json) {
  100. try {
  101. return new ObjectMapper().readValue(json, new TypeReference<List<T>>() {
  102. });
  103. } catch (JsonProcessingException e) {
  104. throw new RuntimeException(e);
  105. }
  106. }
  107. public static Map jsonToMap(String json) {
  108. try {
  109. return new ObjectMapper().readValue(json, HashMap.class);
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113. return new HashMap();
  114. }
  115. public static JsonNode readTree(String json) {
  116. try {
  117. return mapper.readTree(json);
  118. } catch (JsonProcessingException e) {
  119. e.printStackTrace();
  120. }
  121. return new TextNode("");
  122. }
  123. //泛化用的,把带下划线的json转换为驼峰jsom
  124. public static String stringToJson(String ss) {
  125. Map maps = jsonToMap(ss);
  126. Map map = new HashMap();
  127. for (Object obj : maps.keySet()) {
  128. String value = underlineToHump(obj.toString());
  129. map.put(value, maps.get(obj));
  130. }
  131. return beanToJson(map);
  132. }
  133. private static final Pattern UNDERLINE_PATTERN = Pattern.compile("_([a-z])");
  134. /**
  135. * 根据传入的带下划线的字符串转化为驼峰格式
  136. */
  137. public static String underlineToHump(String str) {
  138. //正则匹配下划线及后一个字符,删除下划线并将匹配的字符转成大写
  139. Matcher matcher = UNDERLINE_PATTERN.matcher(str);
  140. StringBuffer sb = new StringBuffer(str);
  141. if (matcher.find()) {
  142. sb = new StringBuffer();
  143. //将当前匹配的子串替换成指定字符串,并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
  144. //正则之前的字符和被替换的字符
  145. matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
  146. //把之后的字符串也添加到StringBuffer对象中
  147. matcher.appendTail(sb);
  148. } else {
  149. //去除除字母之外的前面带的下划线
  150. return sb.toString().replaceAll("_", "");
  151. }
  152. return underlineToHump(sb.toString());
  153. }
  154. }