我已经编写了一段代码来将嵌套对象转换为平面Map<string, Object>
。我需要你的帮助将平面Map<String, Object>
转换为嵌套对象。
例如:
Class BaseModel implements Serializable{}
Class A : BaseModel{
String test;
int testInt;
B b;
}
Class B : BaseModel{
Double testDouble;
List<C> c;
}
Class C : BaseModel{
float testFloat;
}
A类对象将以JSON形式表示,如下所示:
{
"test": "t",
"testInt": 1,
"b": {
"testDouble": 1.1,
"c": [{
"testFloat": 1.2
}]
}
}
使用我下面提到的功能:
public static Map<String, Object> getDataForProcess(BaseModel model, String fieldName){
Map<String, Object> m = new HashMap<String, Object>();
Class<?> thisClass = null;
try {
if(model != null){
thisClass = Class.forName(model.getClass().getName());
Field[] aClassFields = thisClass.getDeclaredFields();
for(Field f : aClassFields){
String fName = null;
if(fieldName != null && fieldName.length() > 0){
fName = fieldName + "_" +f.getName();
} else {
fName = f.getName();
}
if(BaseModel.class.isAssignableFrom(f.getType())){
BaseModel labModel = (BaseModel)f.get(model);
Map<String, Object> mapFromObject = getDataForProcess(labModel, fName);
m.putAll(mapFromObject);
} else if(List.class.isAssignableFrom(f.getType())){
@SuppressWarnings("unchecked")
List<BaseModel> list = (List<BaseModel>)f.get(model);
for(int i=0;i<list.size();i++){
Map<String, Object> mapFromList = getDataForProcess(list.get(i), fName+"_"+i);
m.putAll(mapFromList);
}
} else {
if(!fName.contains("serialVersionUID")){
m.put(fName, f.get(model));
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return m;
}
嵌套对象将转换为:
{
"test": "t",
"testInt": 1,
"b_testDouble": 1.1,
"b_c_0_testFloat": 1.2
}
我需要你的帮助将平面图转换回嵌套对象。
Josson可以根据Jackson JsonNode对象来完成这项工作。您可以在JsonNode上进行进一步处理。
https://github.com/octomix/josson
反序列化
Josson josson = Josson.fromJsonString(
"{" +
" "test": "t"," +
" "testInt": 1," +
" "b": {" +
" "testDouble": 1.1," +
" "c": [{" +
" "testFloat": 1.2" +
" }]" +
" }" +
"}");
压扁
JsonNode flattened = josson.getNode("flatten('_')");
System.out.println(flattened.toPrettyString());
输出
{
"test" : "t",
"testInt" : 1,
"b_testDouble" : 1.1,
"b_c_0_testFloat" : 1.2
}
未稀释
JsonNode unflatten = Josson.create(flattened).getNode("unflatten('_')");
System.out.println(unflatten.toPrettyString());
输出
{
"test" : "t",
"testInt" : 1,
"b" : {
"testDouble" : 1.1,
"c" : [ {
"testFloat" : 1.2
} ]
}
}