检索字段列表中描述的对象字段

时间:2018-01-31 15:26:30

标签: java json

我有要从基本对象中检索的字段列表。我试图使用地图,但它没有用。例如: 我有以下基础对象“审计”(作为json,为了更好地描述)

{
    "sendDate": "11/11/2017",
    "id": "1",
    "user": "name1",
    "role": "admin",    
    "auditType": "download",
    "points": 3
}

我从不同的微服务中得到一个包含要返回的字段的列表,例如

["sendDate", "id", "auditType"] 

对于这个例子,我应该在“审计”下面返回:

{
    "sendDate": "11/11/2017",
    "id": "1",  
    "auditType": "download"
}

我必须返回只有字段列表中描述的字段的Audit类型。有智能解决方案吗?我知道我可能会使用很多,但实际案例要复杂得多,所以我目前正在寻找一个智能解决方案而找不到任何一个。谢谢

1 个答案:

答案 0 :(得分:1)

假设你有一个java类,其中的字段名称与你的json示例中的键一样,并且你想创建一个新的对象形成一个源对象,其中只设置了所选的字段,你可以使用这样的东西:

@SuppressWarnings("unchecked")
public <T> T getObjectWithSelectedFields(T sourceObject, Collection<String> fields)
    throws InstantiationException, IllegalAccessException {
  Class<?> clazz = sourceObject.getClass();
  Object targetObject = clazz.newInstance();

  Arrays.stream(clazz.getDeclaredFields()).filter(f -> fields.contains(f.getName())).forEach(f -> {
    try {
      f.set(targetObject, f.get(sourceObject));
    } catch (IllegalArgumentException | IllegalAccessException e) {
      // TODO ...
    }
  });

  return (T)targetObject;
 }

您可以使用getter和setter轻松实现类似的方法。

请注意,不过这会创建一个与源对象相同类型的新对象(我猜是“审计”)。不同之处在于,只会设置字段列表中提供的字段 - 所有其他字段将为null。你不能做的是动态创建一个只包含你请求的字段的新类。在这种情况下,我宁愿去收集地图选择值。