使用Jackson/ Gson API将Map〈String,Set>转换为POJO

kiayqfof  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(230)

我使用的是第三方API,返回的数据为Map〈String,Set〈?〉〉,格式为JSON,其中key是一个String,与类变量相同,Set包含相关的值,该值将是String,即使是Set,也只需要一个值。
现在,一种方法是循环Map并使用Reflection填充POJO。
我想知道Jackson/ Gson API是否可以用于填充POJO。我尝试了两种方法,但POJO中没有填充值。

  1. JSON:
  2. {
  3. "Id": [
  4. "345"
  5. ],
  6. "Name": [
  7. "John"
  8. ]
  9. }
  10. POJO:
  11. public class Employee implements Serializable {
  12. private String id;
  13. private String name;
  14. // getter / setter
  15. }
  16. My Code:
  17. Map<String, Set<?>> data = someObject.getDataSet();
  18. ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  19. Employee employee = mapper.convertValue(data, Employee.class);
  20. System.out.println(employee);

更新:我尝试了以下操作,但POJO仍然为空

  1. Map<String, Set<?>> data = someObject.getDataSet();
  2. Map<String, String> map = data.entrySet().stream()
  3. .filter(entry -> entry.getValue() != null)
  4. .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().iterator().next().toString()));
  5. Employee employee = null;
  6. ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  7. Employee = mapper.convertValue(map, Employee.class);
  8. System.out.println(employee);
  9. Gson gson = new Gson();
  10. JsonElement jsonElement = gson.toJsonTree(map);
  11. Employee = gson.fromJson(jsonElement, Employee.class);
  12. System.out.println(employee);
9lowa7mx

9lowa7mx1#

您的问题似乎是特定的,我认为没有内置的方法来实现这一点,您可以使用Jackson加载整个树,然后只将节点Map到POJO
例如:

  1. ObjectMapper mapper = new ObjectMapper();
  2. JsonNode root = mapper.readTree(json);
  3. Iterator<JsonNode> ids = root.get("Id").iterator();
  4. Iterator<JsonNode> names = root.get("Names").iterator();
  5. while (ids.hasNext()) {
  6. String id = ids.next().asText();
  7. String name = null;
  8. if (names.hasNext()) {
  9. name = names.next().asText();
  10. }
  11. employees.add(new Employee(id, name));
  12. }

另一种方式:

  1. JsonNode root = objectMapper.readTree(json);
  2. Map<String, Iterator<JsonNode>> iterators = new HashMap<>();
  3. root.fieldNames().forEachRemaining(name -> iterators.put(name, root.get(name).iterator()));
  4. List<Map<String, String>> allAttributes = new ArrayList<>();
  5. while (true) {
  6. Map<String, String> attributes = new HashMap<>();
  7. for (Map.Entry<String, Iterator<JsonNode>> e : iterators.entrySet()) {
  8. if (e.getValue().hasNext()) {
  9. attributes.put(e.getKey(), e.getValue().next().asText());
  10. }
  11. }
  12. if (attributes.size() != 0) {
  13. allAttributes.add(attributes);
  14. } else {
  15. break;
  16. }
  17. }
  18. List<Employee> employees = allAttributes.stream()
  19. .map(this::mapToEmployee)
  20. .collect(Collectors.toList());

然后添加将属性值Map到POJO方法
您也可以在没有Map方法的情况下执行此操作:

  1. JsonNode root = mapper.readTree(json);
  2. Map<String, Iterator<JsonNode>> iterators = new HashMap<>();
  3. root.fieldNames().forEachRemaining(name -> iterators.put(name,
  4. root.get(name).iterator()));
  5. List<JsonNode> nodes = new ArrayList<>();
  6. while (true) {
  7. boolean hasNext = false;
  8. ObjectNode node = mapper.createObjectNode();
  9. for (Map.Entry<String, Iterator<JsonNode>> e : iterators.entrySet()) {
  10. if (e.getValue().hasNext()) {
  11. hasNext = true;
  12. node.put(e.getKey(), e.getValue().next().asText());
  13. }
  14. }
  15. if (hasNext) {
  16. nodes.add(node);
  17. } else {
  18. break;
  19. }
  20. }
  21. List<Employee> employees = new ArrayList<>();
  22. nodes.forEach(node -> {
  23. try {
  24. employees.add(mapper.treeToValue(node, Employee.class));
  25. } catch (JsonProcessingException e) {
  26. e.printStackTrace();
  27. }
  28. });
展开查看全部

相关问题