java是否有合适的模式或方法来遍历数据和动态构造对象?
我正在寻找一些潜在的关于对象遍历的设计模式建议,以便根据所提供的数据动态构造对象
下面,我正在手动构建此对象。最初,根节点是BinaryLogicOpType
,但是可以是基于rootNodeType
的不同对象
我的问题是。。我需要根据列表中的字符串数据动态构造这些不同类型的对象。这样做的最佳途径是什么
如果这个问题让人困惑的话,我愿意细化它
String rootNodeType = fN.type;
BinaryLogicOpType _blop = new BinaryLogicOpType();
JAXBElement<BinaryLogicOpType> root = constructRootElement(_blop, factory, rootNodeType);
/** LETS CREATE THE FIRST CHILD ELEMENT */
BinaryComparisonOpType attrName1GTEFive = new BinaryComparisonOpType();
_blop.getOps().add(factory.createPropertyIsEqualTo(attrName1GTEFive));
JAXBElement<String> attr1Property = factory.createValueReference(fN.nodes.get(0).getProperty());
LiteralType attr1ValueLiteral = new LiteralType();
attr1ValueLiteral.getContent().add(fN.nodes.get(0).getValue());
JAXBElement<LiteralType> attr1Value = factory.createLiteral(attr1ValueLiteral);
attrName1GTEFive.getExpression().add(attr1Property);
attrName1GTEFive.getExpression().add(attr1Value);
示例JSON
{
"type": "AND",
"filters": [
{
"type": "=",
"value": "exampleid",
"property": "id"
},
{
"type": "ILIKE",
"value": "*",
"property": "metacard-tags"
},
{
"type": "OR",
"filters": [
{
"type": ">=",
"value": null,
"property": "benumber"
},
{
"type": "ILIKE",
"value": "redshirts",
"property": "title",
"isCaseSensitive": true
}
]
}
]
}
示例XML
<?xml version="1.0" encoding="UTF-8"?><fes:Filter xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:gml="http://www.opengis.net/gml/3.2">
<fes:Or>
<fes:PropertyIsLessThan matchAction="ANY" matchCase="false">
<fes:ValueReference>name</fes:ValueReference>
<fes:Function name="sub">
<fes:Literal>my-id</fes:Literal>
</fes:Function>
</fes:PropertyIsLessThan>
<fes:And>
<fes:PropertyIsGreaterThanOrEqualTo matchAction="ANY" matchCase="false">
<fes:ValueReference>attName</fes:ValueReference>
<fes:Literal>5</fes:Literal>
</fes:PropertyIsGreaterThanOrEqualTo>
<fes:PropertyIsLike escapeChar="\" matchCase="false" singleChar="?" wildCard="*">
<fes:ValueReference>title</fes:ValueReference>
<fes:Literal>greetings</fes:Literal>
</fes:PropertyIsLike>
<fes:PropertyIsEqual>
<fes:ValueReference>be_number</fes:ValueReference>
<fes:Function>
<fes:Parameter>null</fes:Parameter>
<fes:Parameter>null</fes:Parameter>
</fes:Function>
</fes:PropertyIsEqual>
</fes:And>
</fes:Or>
</fes:Filter>
# 1 楼答案
我认为确实没有简单的解决方案,但我非常确信,用OOP以相当优雅的方式实现转换是可能的
本质上,在这两种情况下,您都在处理AST。它们的结构也没有什么不同。因此,如果您能够为每种可能的节点类型实现转换例程,那么您应该能够转换整个AST
首先,我将为您的JSON结构实现一个好的Java模型。类,如
AndExpression
、ComparisonExpression
、LikeExpression
、OrExpression
等。有关灵感,请检查Filter
模式的生成类。良好的造型在这里至关重要使用poliformic反序列化,以便在解析Jackson后获得正确的对象结构。现在,您“只”需要将此结构转换为JAXB结构
最简单的方法是直接向JSON模型类添加转换方法。我会让他们都用如下方法实现一个接口:
对于像
ILIKE
这样的“叶”AST节点,您可以直接构造适当的对象对于像
AND
或OR
这样的“复合”AST节点,您需要在每个filters
上调用convertToJAXB
,然后通过将结果包装到JAXBElements
中来做更多的工作。这里可能需要一些instanceof
检查;应该有可能想出一个更智能的解决方案