一、前言
基于alibaba的jackson工具库的objectMapper对象实现JSON字符串和常见对象集合容器类型(Map/List/泛型等)相互转换,主要依赖pom如下
<dependency>@b@ <groupId>com.fasterxml.jackson.core</groupId>@b@ <artifactId>jackson-core</artifactId>@b@ <version>2.9.6</version>@b@</dependency>@b@ @b@<dependency>@b@ <groupId>com.fasterxml.jackson.core</groupId>@b@ <artifactId>jackson-annotations</artifactId>@b@ <version>2.9.6</version>@b@</dependency>@b@ @b@<dependency>@b@ <groupId>com.fasterxml.jackson.core</groupId>@b@ <artifactId>jackson-databind</artifactId>@b@ <version>2.9.6</version>@b@</dependency>
二、代码示例
package com.xwood.cloud.jackson;@b@@b@import com.alibaba.excel.util.CollectionUtils;@b@import com.fasterxml.jackson.core.JsonParser;@b@import com.fasterxml.jackson.core.type.TypeReference;@b@import com.fasterxml.jackson.databind.*;@b@import org.apache.commons.lang.StringUtils;@b@import org.springframework.util.ClassUtils;@b@@b@import java.text.SimpleDateFormat;@b@import java.util.*;@b@@b@public class JacksonUtils {@b@@b@ private static ObjectMapper objectMapper = new ObjectMapper();@b@@b@ static {@b@ objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,true);@b@ //配置true标识mapper接受数组作为object对象反序列化@b@ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,true);@b@ //反序列化时,遇到未知属性时是否引起结果失败@b@ objectMapper.configure(MapperFeature.REQUIRE_SETTERS_FOR_GETTERS,false);@b@ //获取getter方法需setter方法,否则@b@@b@ objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,true);@b@ //是否将允许使用非双引号属性名字(这种形式在Javascript中被允许,但是)@b@ objectMapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER,true);@b@ //该特性可以运行接受所有引号引起来的字符,使用‘反斜杠\’机制@b@ objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES,true);@b@ //允许出现单引号@b@ objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);@b@ //允许jacksonUtilsON字符串包含非引号控制字符(值小于32的ASCII字符@b@ objectMapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);@b@ //排序@b@ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);@b@ objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));@b@ //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss@b@ objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));@b@ //指定默认时区东八区@b@ //忽略空Bean转jacksonUtilson的错误@b@ objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);@b@ //类为空时,不要抛异常@b@ }@b@@b@ /**@b@ * 对象转字符串@b@ * @param obj@b@ * @return@b@ */@b@ public static <T> String obj2String(T obj){@b@ if(obj == null){@b@ return null;@b@ }@b@ try {@b@ return obj instanceof String ? (String)obj : objectMapper.writeValueAsString(obj);@b@ } catch (Exception e) {@b@ e.printStackTrace();@b@ return null;@b@ }@b@ }@b@@b@ /**@b@ * 有格式的字符串@b@ * @param obj@b@ * @return@b@ */@b@ public static <T> String obj2StringPretty(T obj){@b@ if(obj == null){@b@ return null;@b@ }@b@ try {@b@ return obj instanceof String ? (String)obj : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);@b@ } catch (Exception e) {@b@ e.printStackTrace();@b@ return null;@b@ }@b@ }@b@@b@ /**@b@ * 字符串转对象@b@ * @param str@b@ * @param clazz@b@ * @return@b@ */@b@ public static <T> T string2Obj(String str,Class<T> clazz){@b@ if(StringUtils.isEmpty(str) || clazz == null){@b@ return null;@b@ }@b@@b@ try {@b@ return clazz.equals(String.class)? (T)str : objectMapper.readValue(str,clazz);@b@ } catch (Exception e) {@b@ e.printStackTrace();@b@ return null;@b@ }@b@ }@b@@b@ /**@b@ * 字段符转List之类的集合@b@ * @param str@b@ * @param typeReference@b@ * @return@b@ */@b@ public static <T> T string2Obj(String str, TypeReference<T> typeReference){@b@ if(StringUtils.isEmpty(str) || typeReference == null){@b@ return null;@b@ }@b@ try {@b@ return (T)(typeReference.getType().equals(String.class)? str : objectMapper.readValue(str,typeReference));@b@ } catch (Exception e) {@b@ e.printStackTrace();@b@ return null;@b@ }@b@ }@b@@b@ /**@b@ * 差不多同上@b@ * @param str@b@ * @param collectionClass@b@ * @param elementClasses@b@ * @return@b@ */@b@ public static <T> T string2Obj(String str,Class<?> collectionClass,Class<?>... elementClasses){@b@ JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass,elementClasses);@b@ try {@b@ return objectMapper.readValue(str,javaType);@b@ } catch (Exception e) {@b@ e.printStackTrace();@b@ return null;@b@ }@b@ }@b@@b@ /**@b@ * 字符串转各种类型List@b@ * @param str@b@ * @param clazz@b@ * @param <T>@b@ * @return@b@ */@b@ public static <T> List<T> string2List(String str,Class<T> clazz){@b@ if(StringUtils.isEmpty(str)){@b@ return null;@b@ }@b@ if(ClassUtils.isPrimitiveOrWrapper(clazz) || ClassUtils.isAssignable(String.class,clazz)@b@ || ClassUtils.isAssignable(List.class,clazz)@b@ || ClassUtils.isAssignable(Set.class,clazz)@b@ || ClassUtils.isAssignable(Map.class,clazz)){@b@@b@ return string2Obj(str, new TypeReference<List<T>>() {});@b@ }else{@b@ List<Map<String,Object>> maplist = (List<Map<String,Object>>)string2Obj(str, new TypeReference<List<T>>() {});@b@ List<T> result=new ArrayList<>();@b@ for(Map<String,Object> map:maplist){@b@ result.add(map2Obj(map,clazz));@b@ }@b@ return result;@b@ }@b@@b@ }@b@@b@ /**@b@ * 字符串json转Map@b@ * @param jsonStr@b@ * @param <T>@b@ * @return@b@ */@b@ public static <T> Map<String,Object> string2Map(String jsonStr){@b@ try {@b@ if(jsonStr==null){@b@ return null;@b@ }@b@ return objectMapper.readValue(jsonStr,Map.class);@b@ } catch(Exception e) {@b@ }@b@ return null;@b@ }@b@@b@ /**@b@ * 字符串json转Map@b@ * @param jsonStr@b@ * @param clazz@b@ * @param <T>@b@ * @return@b@ */@b@ public static <T> Map<String, T> string2Map(String jsonStr,Class<T> clazz){@b@ try {@b@ if(jsonStr==null){@b@ return null;@b@ }@b@@b@ Map<String,Map<String,Object>> map=objectMapper.readValue(jsonStr,new TypeReference<Map<String,T>>(){@b@@b@ });@b@@b@ if(CollectionUtils.isEmpty(map)){@b@ return Collections.emptyMap();@b@ }else{@b@ Map<String,T> result=new HashMap<>(map.size());@b@ for(Map.Entry<String,Map<String,Object>> entry:map.entrySet()){@b@ result.put(entry.getKey(),map2Obj(entry.getValue(),clazz));@b@ }@b@ return result;@b@ }@b@@b@ } catch(Exception e) {@b@ }@b@ return null;@b@ }@b@@b@ /**@b@ * map转dto对象@b@ * @param map@b@ * @param clazz@b@ * @param <T>@b@ * @return@b@ */@b@ public static <T> T map2Obj(Map map, Class<T> clazz){@b@ return objectMapper.convertValue(map,clazz);@b@ }@b@@b@ public static void main(String[] args) {@b@@b@@b@ User user1 = new User(1L,"ywj", 123, new Date());@b@ //1.对象转字符串@b@ System.out.println("【1】:"+JacksonUtils.obj2String(user1));@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //2.对象转有个格式的字符串@b@ System.out.println("【2】:"+JacksonUtils.obj2StringPretty(user1));@b@ System.out.println("_____________________________________________\n\r");@b@@b@ // 3.字符串转对象,打印name字段@b@ User user2 = JacksonUtils.string2Obj("{\"id\":1,\"name\":\"ywj\",\"age\":123,\"date\":\"2018-01-14 22:14:18\",\"abc\":\"abc\"}", User.class);@b@ System.out.println("【3】:"+user2.getName());@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //4.将List转字符串@b@ List<User> userList = new ArrayList<User>();@b@ userList.add(new User(1L,"ywj", 123, new Date()));@b@ userList.add(new User(2L,"ywj2", 123, new Date()));@b@ //转字符串@b@ String userListString = JacksonUtils.obj2String(userList);@b@ System.out.println("【4】:"+userListString);@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //5.字符串转List - TypeReference方式@b@ String userListString2=userListString;@b@ List<User> userList2 = JacksonUtils.string2Obj(userListString2, new TypeReference<List<User>>() {});@b@ System.out.println("【5】:"+userList2.size()+":"+userList2.get(1).getName());@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //6.字符串转List 2@b@ String userListString3=userListString;@b@ List<User> userList3 = JacksonUtils.string2Obj(userListString3, List.class, User.class);@b@ System.out.println("【6】:"+userList3.size()+":"+userList3.get(1).getName());@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //7.字符串转List 3@b@ String userListString4=userListString;@b@ List<User> userList4 = JacksonUtils.string2List(userListString4, User.class);@b@ System.out.println("【7】:"+userList4.size()+":"+userList4.get(1).getName());@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //8.字符串转Map@b@ String userListString5=JacksonUtils.obj2String(user1);@b@ Map<String,Object> userMap=JacksonUtils.string2Map(userListString5);@b@ System.out.println("【8】:"+userMap);@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //9.字符串转Map 2@b@ String userListString6=JacksonUtils.obj2String(user1);;@b@ Map<String,?> userMap2=JacksonUtils.string2Map(userListString5,String.class);@b@ System.out.println("【9】:"+userMap2);@b@ System.out.println("_____________________________________________\n\r");@b@@b@ //10. map转User@b@ Map<String,Object> userMap3=userMap;@b@ User user4=JacksonUtils.map2Obj(userMap3,User.class);@b@ System.out.println("【10】:"+user4.getName());@b@@b@@b@ }@b@@b@@b@}
控制台运行结果
【1】:{"abc":null,"age":123,"date":"2021-08-28 01:57:56","id":1,"name":"ywj"}@b@_____________________________________________@b@@b@【2】:{@b@ "abc" : null,@b@ "age" : 123,@b@ "date" : "2021-08-28 01:57:56",@b@ "id" : 1,@b@ "name" : "ywj"@b@}@b@_____________________________________________@b@@b@【3】:ywj@b@_____________________________________________@b@@b@【4】:[{"abc":null,"age":123,"date":"2021-08-28 01:57:56","id":1,"name":"ywj"},{"abc":null,"age":123,"date":"2021-08-28 01:57:56","id":2,"name":"ywj2"}]@b@_____________________________________________@b@@b@【5】:2:ywj2@b@_____________________________________________@b@@b@【6】:2:ywj2@b@_____________________________________________@b@@b@【7】:2:ywj2@b@_____________________________________________@b@@b@【8】:{abc=null, age=123, date=2021-08-28 01:57:56, id=1, name=ywj}@b@_____________________________________________@b@@b@【9】:null@b@_____________________________________________@b@@b@【10】:ywj@b@@b@Process finished with exit code 0