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