"Mover" valores de mapa anidados de un Map <String, Object> para el nivel superior

anat0lius:

Tome un JSON que ha sido convertida a Map<String, Object>:

{
  "key1": "value1",
  "key2": {
    "nestedKey1": "nested value",
    "nestedKey2": {
      "nestedKey1": "nested value"
    }
  }
}

Donde Objectvalor podría ser algún tipo primitivo o una anidada Map<String, Object>. Mi objetivo es conseguir un mapa plano :

{
  "key1": "value1",
  "key2.nestedKey1": "nested value",
  "key2.nestedKey2.nestedKey1": "nested value"
}

¿Cómo? Cualquier biblioteca que ya lo hace?

desde:

Sí, puede hacerlo en Java8 también.

método de prueba principal:

   Map<String, Object> in = new HashMap<>();
   in.put("key1", "val1");
   Map<String, Object> lvl1 = new HashMap<>();
   lvl1.put("key2", "val2");
   lvl1.put("key3", Collections.singletonMap("k3", "v3"));
   in.put("key2", lvl1);

   Map<String, Object> out = flatten(in);

métodos de transformadores:

private Map<String, Object> flatten(Map<String, Object> in) {
    return in.entrySet().stream()
        .flatMap(entry -> flatten(entry).entrySet().stream())
        .collect(Collectors.toMap( 
               Map.Entry::getKey, 
               Map.Entry::getValue));
}

private Map<String, Object> flatten(Map.Entry<String, Object> in) {
  // for other then Map objects return them
  if (!Map.class.isInstance(in.getValue())) {
    return Collections.singletonMap(in.getKey(), in.getValue());
  }
  // extract the key prefix for nested objects
  String prefix = in.getKey();
  Map<String, Object> values = (Map<String, Object>) in.getValue();
  // create a new Map, with prefix added to each key
  Map<String, Object> flattenMap = new HashMap<>();
  values.keySet().forEach(key -> {
    // use a dot as a joining char
    flattenMap.put(prefix + "." + key, values.get(key));
  });
  // use recursion to flatten the structure deeper
  return flatten(flattenMap);
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=187338&siteId=1
Recomendado
Clasificación