我已经转换为POJO的服务器响应(很长一段时间)(通过使用moshi库)。
最终我列出了" Items" ,每个"项目"看起来像是:
public class Item
{
private String aa;
private String b;
private String abc;
private String ad;
private String dd;
private String qw;
private String arew;
private String tt;
private String asd;
private String aut;
private String id;
...
}
我真正需要的是拉出以" a"开头的所有属性。 ,然后我需要使用他们的值进一步要求...
没有反射可以实现它吗? (流的使用可能?)
由于
答案 0 :(得分:1)
使用guava函数转换,您可以使用以下某些内容转换项目:
public static void main(String[] args) {
List<Item> items //
Function<Item, Map<String, Object>> transformer = new Function<Item, Map<String, Object>>() {
@Override
public Map<String, Object> apply(Item input) {
Map<String, Object> result = new HashMap<String, Object>();
for (Field f : input.getClass().getDeclaredFields()) {
if(! f.getName().startsWith("a")) {
continue;
}
Object value = null;
try {
value = f.get(input);
} catch (IllegalAccessException e) {
throw new RuntimeException("failed to cast" + e)
}
result.put(f.getName(), value);
}
return result
};
Collection<Map<String, Object> result
= Collections2.transform(items, transformer);
}
答案 1 :(得分:0)
听起来您可能想要在常规Java地图结构上执行过滤。
// Dependencies.
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<Map<String, String>> itemAdapter =
moshi.adapter(Types.newParameterizedType(Map.class, String.class, String.class));
String json = "{\"aa\":\"value1\",\"b\":\"value2\",\"abc\":\"value3\"}";
// Usage.
Map<String, String> value = itemAdapter.fromJson(json);
Map<String, String> filtered = value.entrySet().stream().filter(
stringStringEntry -> stringStringEntry.getKey().charAt(0) == 'a')
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
您可以将过滤逻辑包装在自定义JsonAdapter中,但验证和业务逻辑往往很适合留给应用程序使用层。