Java - 需要将平面映射<字符串、对象>转换为嵌套对象



我已经编写了一段代码来将嵌套对象转换为平面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
} ]
}
}

最新更新