|
|
|
@ -56,6 +56,7 @@ import org.springframework.util.StringUtils; |
|
|
|
* @author Juergen Hoeller |
|
|
|
* @author Juergen Hoeller |
|
|
|
* @author Sam Brannen |
|
|
|
* @author Sam Brannen |
|
|
|
* @author Brian Clozel |
|
|
|
* @author Brian Clozel |
|
|
|
|
|
|
|
* @author Mengqi Xu |
|
|
|
* @since 4.1 |
|
|
|
* @since 4.1 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public abstract class YamlProcessor { |
|
|
|
public abstract class YamlProcessor { |
|
|
|
@ -244,13 +245,7 @@ public abstract class YamlProcessor { |
|
|
|
if (value instanceof Map) { |
|
|
|
if (value instanceof Map) { |
|
|
|
value = asMap(value); |
|
|
|
value = asMap(value); |
|
|
|
} |
|
|
|
} |
|
|
|
if (key instanceof CharSequence) { |
|
|
|
result.put(key.toString(), value); |
|
|
|
result.put(key.toString(), value); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
// It has to be a map key in this case
|
|
|
|
|
|
|
|
result.put("[" + key.toString() + "]", value); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
}); |
|
|
|
return result; |
|
|
|
return result; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -305,17 +300,20 @@ public abstract class YamlProcessor { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected final Map<String, Object> getFlattenedMap(Map<String, Object> source) { |
|
|
|
protected final Map<String, Object> getFlattenedMap(Map<String, Object> source) { |
|
|
|
Map<String, Object> result = new LinkedHashMap<>(); |
|
|
|
Map<String, Object> result = new LinkedHashMap<>(); |
|
|
|
buildFlattenedMap(result, source, null); |
|
|
|
buildFlattenedMap(result, source, null, false); |
|
|
|
return result; |
|
|
|
return result; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings({"rawtypes", "unchecked"}) |
|
|
|
@SuppressWarnings({"rawtypes", "unchecked"}) |
|
|
|
private void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, @Nullable String path) { |
|
|
|
private void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, @Nullable String path, boolean isIndexedKey) { |
|
|
|
source.forEach((key, value) -> { |
|
|
|
source.forEach((key, value) -> { |
|
|
|
if (StringUtils.hasText(path)) { |
|
|
|
if (StringUtils.hasText(path)) { |
|
|
|
if (key.startsWith("[")) { |
|
|
|
if (isIndexedKey) { |
|
|
|
key = path + key; |
|
|
|
key = path + key; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if (key.startsWith("[") || key.endsWith("]")) { |
|
|
|
|
|
|
|
key = path + '[' + key + ']'; |
|
|
|
|
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
key = path + '.' + key; |
|
|
|
key = path + '.' + key; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -325,7 +323,7 @@ public abstract class YamlProcessor { |
|
|
|
} |
|
|
|
} |
|
|
|
else if (value instanceof Map map) { |
|
|
|
else if (value instanceof Map map) { |
|
|
|
// Need a compound key
|
|
|
|
// Need a compound key
|
|
|
|
buildFlattenedMap(result, map, key); |
|
|
|
buildFlattenedMap(result, map, key, false); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (value instanceof Collection collection) { |
|
|
|
else if (value instanceof Collection collection) { |
|
|
|
// Need a compound key
|
|
|
|
// Need a compound key
|
|
|
|
@ -336,7 +334,7 @@ public abstract class YamlProcessor { |
|
|
|
int count = 0; |
|
|
|
int count = 0; |
|
|
|
for (Object object : collection) { |
|
|
|
for (Object object : collection) { |
|
|
|
buildFlattenedMap(result, Collections.singletonMap( |
|
|
|
buildFlattenedMap(result, Collections.singletonMap( |
|
|
|
"[" + (count++) + "]", object), key); |
|
|
|
"[" + (count++) + "]", object), key, true); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|