我有一个用例,我在请求中收到了一些这样的属性,
"filters": [
{
"field": "fName",
"value": "Tom"
},
{
"field": "LName",
"value": "Hanks"
}
]
我没有为此定义模型。我只是在请求中收到这些属性,然后使用这些属性在弹性搜索上触发查询。我在弹性搜索中的记录具有相同的属性名称。
现在,我必须支持一个属性名称完全不同的旧版应用程序。 例如: fName 变为名字,而 lName 变为 lastName 。
问题::需要在请求中接受旧的属性名称,然后将其转换为新的属性名称,以便与我的弹性搜索记录匹配。在使用应用程序发送响应之前,使用新的属性名称获取数据并转换回旧的属性名称。
注意::我没有为这些记录定义POJO。
如何有效地做到这一点?我当时在考虑使用Orika映射器,但不确定在不先定义类的情况下该如何工作。
答案 0 :(得分:4)
是什么阻止您编写从请求JSON到规范化JSON的转换器?
我能想到的正常流程是:
Request JSON -> POJO -> POJO with normalized value -> Normalized JSON
所以您的POJO如下:
public class Filter {
List<FieldFilter> filters;
public static class FieldFilter {
private String field;
private String value;
}
}
现在您将拥有一个转换图,如:
Map<String, String> fieldNameMapping = new HashMap<>();
fieldNameMapping.put("fName", "firstName");
fieldNameMapping.put("firstName", "firstName");
// The process of populating this map can be done either by a static initializer, or config/properties reader
然后您转换POJO:
Filter filterRequest;
List<FieldFilters> normlizedFilters =
filterReq.getFilters().stream()
.map(f -> new FieldFilter(fieldNameMapping.get(f.getField()), f.getValue())
.collect(toList());
然后将Filter类转换为标准化的JSON。
答案 1 :(得分:3)
我们有一个类似的场景,我们正在使用apache JOLT。如果您想尝试一些示例,可以参考jolt-demo-online-utility
答案 2 :(得分:0)
改为使用JSON到JSON-transformer。可以在以下位置找到有关此问题的良好答案:JSON to JSON transformer和此处:XSLT equivalent for JSON
最后,您在这里不需要中间对象类型。您甚至说过,您还没有这样的类型,而发明它,仅仅为了对其进行转换,就没有任何意义。