Json 格式在数据中较为常见,为了避免重复开发,整理了比较实用的代码片段,仅供参考。

    Java 版

    1. package com.xx.common.util;
    2. import java.io.IOException;
    3. import java.util.ArrayList;
    4. import java.util.HashMap;
    5. import java.util.List;
    6. import java.util.Map;
    7. import java.util.Map.Entry;
    8. import com.fasterxml.jackson.annotation.JsonInclude;
    9. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    10. import com.fasterxml.jackson.core.JsonGenerator;
    11. import com.fasterxml.jackson.core.JsonParser;
    12. import com.fasterxml.jackson.core.JsonParseException;
    13. import com.fasterxml.jackson.core.type.TypeReference;
    14. import com.fasterxml.jackson.databind.ObjectMapper;
    15. import com.fasterxml.jackson.databind.DeserializationFeature;
    16. import com.fasterxml.jackson.databind.JsonNode;
    17. import com.fasterxml.jackson.databind.JsonMappingException;
    18. import com.fasterxml.jackson.databind.SerializationFeature;
    19. import com.fasterxml.jackson.databind.node.ArrayNode;
    20. import com.fasterxml.jackson.databind.node.JsonNodeFactory;
    21. import com.fasterxml.jackson.databind.node.ObjectNode;
    22. import org.apache.commons.lang.StringUtils;
    23. public class JsonUtil {
    24. public final static ObjectMapper objectMapper = new ObjectMapper();
    25. static {
    26. /**
    27. * 如果为空则不输出
    28. */
    29. objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
    30. /**
    31. * 对于空的对象转json的时候不抛出错误
    32. *
    33. * 是否允许一个类型没有注解表明打算被序列化。默认true,抛出一个异常;否则序列化一个空对象,比如没有任何属性。
    34. */
    35. objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    36. /**
    37. * 禁用序列化日期为timestamps
    38. *
    39. * 该特性决定是否将基于Date的值序列化为timestamp数字式的值,或者作为文本表示。
    40. * 如果文本表示,则实际格式化的时候会调用{@link #getDateFormat}方法。
    41. *
    42. * 该特性可能会影响其他date相关类型的处理,虽然我们理想情况是只对date起作用。
    43. */
    44. objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    45. /**
    46. * 禁用遇到未知属性抛出异常
    47. *
    48. * 该特性决定了当遇到未知属性(没有映射到属性,没有任何setter或者任何可以处理它的handler),是否应该抛出一个
    49. * JsonMappingException异常。这个特性一般式所有其他处理方法对未知属性处理都无效后才被尝试,属性保留未处理状态。
    50. *
    51. * 默认情况下,该设置是被打开的。若不设置, 可以在 java class 中使用 @JsonIgnoreProperties 注解
    52. */
    53. objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    54. /**
    55. * 视空字符传为null
    56. *
    57. * 该特性可以允许JSON空字符串转换为POJO对象为null。如果禁用,则标准POJO只会从JSON null或者JSON对象转换过来;
    58. * 如果允许,则空JSON字符串可以等价于JSON null。
    59. * @since 1.8
    60. */
    61. objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
    62. /**
    63. * 该特性决定parser将是否允许解析使用Java/C++ 样式的注释(包括'/'+'*' 和'//' 变量)。 由于JSON标准说明书上面没有提到注释是否是合法的组成,所以这是一个非标准的特性;
    64. * 尽管如此,这个特性还是被广泛地使用。
    65. *
    66. * 注意:该属性默认是false,因此必须显式允许,即通过 JsonParser.Feature.ALLOW_COMMENTS 配置为 true。
    67. */
    68. objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
    69. /**
    70. * 允许属性名称没有引号
    71. *
    72. * 这个特性决定parser是否将允许使用非双引号属性名字, (这种形式在Javascript中被允许,但是JSON标准说明书中没有)。
    73. *
    74. * 注意:由于JSON标准上需要为属性名称使用双引号,所以这也是一个非标准特性,默认是false的。
    75. * 同样,需要设置JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES为true,打开该特性。
    76. *
    77. */
    78. objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    79. /**
    80. * 允许单引号
    81. *
    82. * 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。
    83. * JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性。
    84. *
    85. * 注意:默认时候,该属性关闭的。需要设置:JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS为true。
    86. */
    87. objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    88. /**
    89. * 取消对非ASCII字符的转码
    90. */
    91. objectMapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false);
    92. /**
    93. * 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。
    94. * JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性。
    95. *
    96. * 注意:默认时候,该属性关闭的。需要设置:JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS 为 true。
    97. */
    98. objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    99. }
    100. public static Map<String, Object> JsonToMap(String json) {
    101. // jackson
    102. Map<String, Object> map = new HashMap<String, Object>();
    103. try {
    104. map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>(){});
    105. } catch (JsonParseException e) {
    106. e.printStackTrace();
    107. } catch (JsonMappingException e) {
    108. e.printStackTrace();
    109. } catch (IOException e) {
    110. e.printStackTrace();
    111. }
    112. return map;
    113. }
    114. public static <T> T JsonToBean(String json, Class<T> clz) {
    115. // json to javabean
    116. T t = null;
    117. try {
    118. t = objectMapper.readValue(json, clz);
    119. } catch (JsonParseException e) {
    120. e.printStackTrace();
    121. } catch (JsonMappingException e) {
    122. e.printStackTrace();
    123. } catch (IOException e) {
    124. e.printStackTrace();
    125. }
    126. return t;
    127. }
    128. public static String JsonFindPath(String json, String path) {
    129. String resultPath = null;
    130. try {
    131. JsonNode pathNode = objectMapper.readTree(json);
    132. String[] paths = StringUtils.split(path,".");
    133. for (int i = 0, len = paths.length; i < len; i ++ ) {
    134. String curPath = paths[i];
    135. if (curPath.isEmpty()) {
    136. continue;
    137. } else if (StringUtils.isNumeric(curPath)) {
    138. int idxPath = java.lang.Integer.parseInt(curPath);
    139. pathNode = pathNode.path(idxPath);
    140. } else {
    141. pathNode = pathNode.path(curPath);
    142. }
    143. }
    144. resultPath = pathNode.toString();
    145. } catch (IOException e) {
    146. e.printStackTrace();
    147. }
    148. return resultPath;
    149. }
    150. public static Map<String, Object> ListMapToMap(List<Map<String, Object>> listMap) {
    151. // 保存处理好的 Json 格式
    152. Map<String, Object> resultMap = new HashMap<String, Object>();
    153. try {
    154. Map<String, Object> formatMap;
    155. for (int i = 0, len = listMap.size(); i < len; i ++) {
    156. Map<String, Object> valMap = listMap.get(i);
    157. try {
    158. formatMap = valMap;
    159. // 把 list map 中嵌套数据, 放到 map 中
    160. for(Entry<String, Object> entry :formatMap.entrySet()) {
    161. resultMap.put(entry.getKey(), entry.getValue());
    162. }
    163. } catch (ClassCastException e) {
    164. System.out.println("Exception: " + valMap + " : " + e.getMessage());
    165. }
    166. formatMap = null;
    167. }
    168. } catch(Exception e) {
    169. System.out.println("Exception: " + listMap + " : " + e.toString());
    170. }
    171. return resultMap;
    172. }
    173. }

    Scala 版

    1. package com.xx.common.util
    2. import net.minidev.json.{JSONObject, JSONArray}
    3. import net.minidev.json.parser.JSONParser
    4. import scala.collection.mutable.Map
    5. import scala.collection.JavaConversions.mapAsScalaMap
    6. import scala.collection.JavaConversions.mutableMapAsJavaMap
    7. object ScalaJsonUtil {
    8. /**
    9. * map -> json
    10. * @param map 输入格式 mutable.Map[String,Object]
    11. * @return
    12. * */
    13. def SmartMapToJson(map : Map[String, Object]): String = {
    14. val jsonString = JSONObject.toJSONString(map)
    15. jsonString
    16. }
    17. /**
    18. * json -> Map
    19. * @param json 输入json字符串
    20. * @return
    21. * */
    22. def SmartJsonToMap(json: String): Map[String, Object] = {
    23. val map : Map[String, Object]= Map()
    24. if (json == null || json == "") {
    25. return map
    26. }
    27. //将string转化为jsonObject
    28. val jsonParser = new JSONParser()
    29. try {
    30. val jsonObj: JSONObject = jsonParser.parse(json).asInstanceOf[JSONObject]
    31. if (jsonObj == null) {
    32. return map
    33. }
    34. //获取所有键
    35. val jsonKey = jsonObj.keySet()
    36. val iter = jsonKey.iterator()
    37. while (iter.hasNext){
    38. val field = iter.next()
    39. val value = jsonObj.get(field).toString
    40. if(value.startsWith("{")&&value.endsWith("}")){
    41. val value = mapAsScalaMap(jsonObj.get(field).asInstanceOf[java.util.HashMap[String, String]])
    42. map.put(field,value)
    43. }else{
    44. map.put(field,value)
    45. }
    46. }
    47. } catch {
    48. case ex: Exception => return map
    49. }
    50. return map
    51. }
    52. /**
    53. * json list map -> list string
    54. * [{},{}] -> List[String]
    55. */
    56. def SmartJsonToList(json: String): List[String] = {
    57. var list = List[String]()
    58. if (json == null || json == "") {
    59. return list
    60. }
    61. val jsonParser = new JSONParser()
    62. val jsonArr: JSONArray = jsonParser.parse(json).asInstanceOf[JSONArray]
    63. for(i <- 0 to jsonArr.size() - 1) {
    64. if(jsonArr.get(i) != null){
    65. val node = jsonArr.get(i).toString()
    66. list = list :+ node
    67. }
    68. }
    69. return list
    70. }
    71. /**
    72. * [{},{}] -> List[Map, Map]
    73. */
    74. def SmartJsonToListMap(json: String): List[Map[String, Object]] = {
    75. var listMap = List[Map[String, Object]]()
    76. if (json == null || json == "") {
    77. return listMap
    78. }
    79. val jsonParser = new JSONParser()
    80. val jsonArr: JSONArray = jsonParser.parse(json).asInstanceOf[JSONArray]
    81. for(i <- 0 to jsonArr.size() - 1) {
    82. if (jsonArr.get(i) != null || jsonArr.get(i) != "" ) {
    83. val node = SmartJsonToMap(jsonArr.get(i).toString())
    84. if (node != null) {
    85. listMap = listMap :+ node
    86. }
    87. }
    88. }
    89. return listMap
    90. }
    91. /**
    92. * json Object -> Map
    93. */
    94. def SmartGetMap(ob: Object): Map[String, Object] = {
    95. var map = Map[String, Object]()
    96. if (ob != null || ob != "") {
    97. map = ob.asInstanceOf[scala.collection.mutable.Map[String, Object]];
    98. }
    99. map
    100. }
    101. def JsonListToMap(fields: String): Map[String, Object] = {
    102. //val listStr = SmartJsonToList(fields)
    103. val listMap = SmartJsonToListMap(fields)
    104. //ListStrToMap(listStr)
    105. ListMapToMap(listMap)
    106. }
    107. /**
    108. * List[Json] -> Map
    109. */
    110. def ListStrToMap(list: List[String]): Map[String, Object] = {
    111. val formatMap = Map[String, Object]()
    112. list.foreach { json =>
    113. val map = SmartJsonToMap(json)
    114. for ((k, v) <- map) {
    115. formatMap.put(k, v)
    116. }
    117. }
    118. formatMap
    119. }
    120. /**
    121. * List[Map] -> Map
    122. */
    123. def ListMapToMap(listMap: List[Map[String, Object]]): Map[String, Object] = {
    124. val formatMap = Map[String, Object]()
    125. listMap.foreach{ map =>
    126. for ((k, v) <- map) {
    127. formatMap.put(k, v)
    128. }
    129. }
    130. formatMap
    131. }
    132. /**
    133. * 对象转Json字符串
    134. * @param ob 对象
    135. * @return 字符串
    136. */
    137. def objectToJson(ob: Object): String = {
    138. var commonJson = ""
    139. if (ob != "") {
    140. val commonMap = SmartGetMap(ob)
    141. commonJson = SmartMapToJson(commonMap)
    142. }
    143. commonJson
    144. }
    145. }