/**
* 获取Map中所有字段
* 暂时只支持Map中List数据解析 不支持数组[]
*/
public static void getMapColumn(List<Column> columns, String fieldName, String parentKey, List<Object> mapList, IFormat<String> keyFormat) {
if (mapList != null && mapList.size() > 0) {
Object o = mapList.get(0);
if (o != null) {
if (o instanceof Map) {
Map<String, Object> map = (Map<String, Object>) o;
//暂时只能解析json每个层级一个Array
boolean isOneArray = true;
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
if (ArrayColumn.isList(val)) {
if (isOneArray) {
List<Object> list = ((List) val);
getMapColumn(columns, fieldName + key + ".", key, list, keyFormat);
isOneArray = false;
}
} else {
String columnName = keyFormat == null ? key : keyFormat.format(key);
MapColumn<Object> column = new MapColumn<>(columnName, fieldName + key);
columns.add(column);
}
}
} else if (o instanceof CustomColumn) {
CustomColumn customColumn = (CustomColumn) o;
String[] keys = customColumn.getColumns();
//暂时只能解析json每个层级一个Array
boolean isOneArray = true;
if (keys != null) {
for (String key : keys) {
Object val = customColumn.getValueByColumnName(key);
if (ArrayColumn.isList(val)) {
if (isOneArray) {
List<Object> list = ((List) val);
getMapColumn(columns, fieldName + key + ".", key, list, keyFormat);
isOneArray = false;
}
} else {
String columnName = keyFormat == null ? key : keyFormat.format(key);
MapColumn<Object> column = new MapColumn<>(columnName, fieldName + key);
columns.add(column);
}
}
}
} else {
String columnName = keyFormat == null ? parentKey : keyFormat.format(parentKey);
MapColumn<Object> column = new MapColumn<>(columnName, fieldName, false);
columns.add(column);
}
}
}
}
public interface CustomColumn {
String[] getColumns();
Object getValueByColumnName(String columnName);
}
调整MapColumn的方法
protected void getFieldData(String[] fieldNames,int start,Object child,int level,boolean isFoot) throws NoSuchFieldException, IllegalAccessException {
for (int i = start; i < fieldNames.length; i++) {
if (child == null) {
addData(null, isFoot);
countColumnValue(null);
getStructure().putNull(level,isFoot);
break;
}
if (child instanceof Map) {
child = ((Map) child).get(fieldNames[i]);
if (!isList(child)) {
if (i == fieldNames.length - 1) {
if (child == null) {
getStructure().putNull(level,isFoot);
}
T t = (T) child;
addData(t, true);
countColumnValue(t);
}
} else {
level++;
if (child.getClass().isArray()) {
isArrayColumn = true;
T[] data = (T[]) child;
setArrayType(ARRAY);
for (Object d : data) {
if (i == fieldNames.length - 1) {
addData((T) d, true);
} else {
getFieldData(fieldNames, i + 1, d, level, true);
}
}
getStructure().put(level - 1, data.length,isFoot);
} else {
List data = (List) child;
setArrayType(LIST);
isArrayColumn = true;
for (Object d : data) {
if (i == fieldNames.length - 1) {
T t = (T) d;
addData(t, true);
} else {
getFieldData(fieldNames, i + 1, d, level, true);
}
}
getStructure().put(level - 1, data.size(),isFoot);
}
break;
}
} else if (child instanceof MapTableData.CustomColumn) {
MapTableData.CustomColumn customColumn = (MapTableData.CustomColumn) child;
String fieldName = fieldNames[i];
child = customColumn.getValueByColumnName(fieldName);
if (!isList(child)) {
if (i == fieldNames.length - 1) {
if (child == null) {
getStructure().putNull(level,isFoot);
}
T t = (T) child;
addData(t, true);
countColumnValue(t);
}
} else {
level++;
if (child.getClass().isArray()) {
isArrayColumn = true;
T[] data = (T[]) child;
setArrayType(ARRAY);
for (Object d : data) {
if (i == fieldNames.length - 1) {
addData((T) d, true);
} else {
getFieldData(fieldNames, i + 1, d, level, true);
}
}
getStructure().put(level - 1, data.length,isFoot);
} else {
List data = (List) child;
setArrayType(LIST);
isArrayColumn = true;
for (Object d : data) {
if (i == fieldNames.length - 1) {
T t = (T) d;
addData(t, true);
} else {
getFieldData(fieldNames, i + 1, d, level, true);
}
}
getStructure().put(level - 1, data.size(),isFoot);
}
break;
}
}
}
}
实现model
@Override
public String[] getColumns() {
return new String[]{"xx", "bb"};
}
@Override
public Object getValueByColumnName(String columnName) {
switch (columnName) {
case "xx":
return BZLotNo;
case "bb":
return jitai;
default:
return "未知:"+columnName;
}
}
网友评论