java 如何反序列化复杂的map呢?
例如:
待反序列化的json字符串:
{"/policyTemplate":{"modifyType":2,"keyword":"12","replacement":"4"}}
什么是复杂的map呢?
即map的key不是简单的int或者String,而是一个复杂的对象,比如Student,User等
实例:
map中key对应的java bean:
package com.common.bean; /** * Created by 黄威 on 19/01/2017.<br > * 修改类型:1-完全替换;<br />2-关键字替换;<br />3-正则表达式替换 */ public class ModifyTypeInfo { /*** * 1-完全替换 */ public static final int MODIFY_TYPE_REPLACE_TOTALLY=1; /*** * 2-关键字替换 */ public static final int MODIFY_TYPE_KEY_WORD=2; /*** * 3-正则表达式替换 */ public static final int MODIFY_TYPE_REGUX_REPLACE=3; private int modifyType; private String keyword; private String replacement; public int getModifyType() { return modifyType; } public void setModifyType(int modifyType) { this.modifyType = modifyType; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public String getReplacement() { return replacement; } public void setReplacement(String replacement) { this.replacement = replacement; } }
单元测试:
@Test public void test_map(){ String modifyConf="{\"/policyTemplate\":{\"modifyType\":2,\"keyword\":\"12\",\"replacement\":\"9\"}}"; Map<String, ModifyTypeInfo> proxymodifyResponseBodyMap=HWJacksonUtils.deSerializeMap(modifyConf,ModifyTypeInfo.class); System.out.println(proxymodifyResponseBodyMap); }
核心方法:
/** * 获取泛型的Collection Type * @param collectionClass 泛型的Collection * @param elementClasses 元素类 * @return JavaType Java类型 * @since 1.0 */ public static JavaType getCollectionType(ObjectMapper mapper,Class<?> collectionClass, Class<?>... elementClasses) { return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses); } /*** * 反序列化复杂map * @param jsonInput * @param clazz * @return */ public static Map deSerializeMap(String jsonInput, Class clazz) { Map obj = null; try { ObjectMapper mapper = getObjectMapper(); JavaType javaType = getCollectionType(mapper, HashMap.class, String.class, clazz); obj = mapper.readValue(jsonInput, javaType); return obj; } catch (Exception e) { e.printStackTrace(); } return obj; }
实例:
//读取配置文件,并反序列化 private void parseConfig() { try { String configJson = readConfig(configFileTextField.getText2()); proxyModifyResponseBodyMap = HWJacksonUtils.deSerializeMap(configJson, ModifyTypeInfo.class); servletPathList = new ArrayList<>(); for (String key : proxyModifyResponseBodyMap.keySet()) { servletPathList.add(key); } } catch (IOException e) { e.printStackTrace(); } }
详情参考附件中的类:com/io/hw/json/HWJacksonUtils.java