按某种模式过滤pojo属性

时间:2018-04-27 20:20:40

标签: java json properties filtering moshi

我已经转换为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"开头的所有属性。 ,然后我需要使用他们的值进一步要求...

没有反射可以实现它吗? (流的使用可能?)

由于

2 个答案:

答案 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中,但验证和业务逻辑往往很适合留给应用程序使用层。