【仅供内部供应商使用,不提供对外解答和培训】

Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
title处理数组元素的示例代码
collapsetrue
public class ArrayColumnResolver extends AbstractColumnResolver {

    @Override
    public boolean accept(Object cell) {
        return cell instanceof ArrayList
                && !(((ArrayList) cell).get(0) instanceof Document);
    }


    @Override
    public List<FieldObject> expandColumn(String key, Object cell) {
        List<FieldObject> data = new ArrayList<FieldObject>();
         data.add(FieldObject.create(key));
         return data;
    }

    @Override
    public void expandData(Document doc, List<String> columnNames, Map<FieldObject, ColumnResolver> columnResolverMap, List<List<Object>> rowDataCollections, List<Object> rowData) {
        Map<Integer, List<Object>> group = new HashMap<Integer, List<Object>>();
        List<Object> standard = null;
        int maxLength = 0;
        for (Map.Entry<FieldObject, ColumnResolver> entry : columnResolverMap.entrySet()) {
            if (!checkIfConditionMeet(entry.getValue())) {
                continue;
            }
            FieldObject fieldObject = entry.getKey();
            Object data = doc.get(fieldObject.getOriginalName());
            if (data instanceof ArrayList) {
                List<Object> array = (List<Object>) data;
                if (standard == null) {
                    standard = array;
                }
                maxLength = Math.max(maxLength, array.size());
                group.put(fieldObject.getIndex(), array);
            }
        }

        if (standard != null) {
            for (int i = 0; i < maxLength; i++) {
                List<Object> row = new ArrayList<Object>(Arrays.asList(new Object[rowData.size()]));
                Collections.copy(row, rowData);
                for (FieldObject fieldObject : columnResolverMap.keySet()) {
                    List<Object> array = group.get(fieldObject.getIndex());
                    row.set(fieldObject.getIndex(), array.size() > i ? array.get(i) : null);
                }
                rowDataCollections.add(row);
            }
        }
    }
}

示例实现(数组对象类型)

我们以数组元素为例子,面对这样的数据结构:

Code Block
title带数组对象元素的JSON结构
collapsetrue
{ 
    "TEST_ID" : "8376", 
    "Section_Name" : "大三李", 
    "ItemList" : [
        {
            "Item_Name" : "AAA", 
            "Item_Value" : "123"
        }, 
        {
            "Item_Name" : "BBB", 
            "Item_Value" : "456"
        }, 
        {
            "Item_Name" : "CCC", 
            "Item_Value" : "789"
        }
    ]
}

希望展现成下面形式的二维表:

Image Added

同样可以通过实现接口com.fr.plugin.db.mongo.expand.ColumnResolver来实现,示例代码如下:

Code Block
title数据中包含对象的JSON结构处理代码
collapsetrue
public class ArrayMapColumnResolver extends AbstractColumnResolver {

    @Override
    public boolean accept(Object cell) {
        return cell instanceof ArrayList && ((ArrayList) cell).get(0) instanceof Document;
    }

    @Override
    public List<FieldObject> expandColumn(String key, Object cell) {
        List<FieldObject> expand = new ArrayList<FieldObject>();
        if (cell instanceof ArrayList) {
            Document document = (Document) ((ArrayList) cell).get(0);
            for (String name : document.keySet()) {
                expand.add(FieldObject.create(key, name));
            }
        }
        return expand;
    }

    @Override
    public void expandData(Document doc,
                           List<String> columnNames,
                           Map<FieldObject, ColumnResolver> columnResolverMap,
                           List<List<Object>> rowDataCollections,
                           List<Object> rowData) {
        boolean expanded = false;
        List<List<Object>> rowList = new ArrayList<List<Object>>();
        for (Map.Entry<FieldObject, ColumnResolver> entry : columnResolverMap.entrySet()) {
            if (!checkIfConditionMeet(entry.getValue())) {
                continue;
            }

            FieldObject fieldObject = entry.getKey();
            List<Document> children = (ArrayList<Document>) doc.get(fieldObject.getOriginalName());
            for (int i = 0, size = children.size(); i < size; i ++) {
                Document document = children.get(i);
                if (!expanded) {
                    List<Object> row = new ArrayList<Object>(Arrays.asList(new Object[rowData.size()]));
                    Collections.copy(row, rowData);
                    row.set(fieldObject.getIndex(), document.get(fieldObject.getCurrentName()));
                    rowDataCollections.add(row);
                    rowList.add(row);
                } else {
                    rowList.get(i).set(fieldObject.getIndex(), document.get(fieldObject.getCurrentName()));
                }
            }
            expanded = true;
        }
    }
}

 

注册方式

Code Block
<dependence>
    <Item key="com.fr.solution.plugin.db.mongo" type="plugin"/>
</dependence>
<extra-core>
    <ColumnResolver class="com.fr.plugin.db.mongo.expand.impl.ArrayColumnResolver"/>
</extra-core>

使用方式

同时安装MongoDB插件和列处理插件,就可以实现自已的要求了。

...