allow JsonArray to pretty-print in a single line when appropriate
This commit is contained in:
parent
1da002ce70
commit
97892ff273
@ -370,12 +370,27 @@ public record JsonArray(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull String toPrettyJsonString() {
|
public @NotNull String toPrettyJsonString(int depth) {
|
||||||
if (size() < 2) return toJsonString();
|
if (size() < 2) return toJsonString();
|
||||||
|
|
||||||
var out = new StringJoiner(",\n", "[\n", "\n]");
|
var entries = new ArrayList<String>(elements.size());
|
||||||
elements().forEach(e -> out.add(indent(JsonValue.toPrettyJsonString(e))));
|
var length = 0L;
|
||||||
return out.toString();
|
var composite = false;
|
||||||
|
for (var element : elements) {
|
||||||
|
var string = JsonValue.toPrettyJsonString(element, depth + Util.PRETTY_PRINT_INDENT.length());
|
||||||
|
entries.add(string);
|
||||||
|
|
||||||
|
composite |= element instanceof JsonObject || element instanceof JsonArray;
|
||||||
|
length += string.length() + 2; // +2 to account for ", " and "[]"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!composite && depth + length <= Util.PRETTY_PRINT_ARRAY_MULTILINE_THRESHOLD) {
|
||||||
|
return "[" + String.join(", ", entries) + "]";
|
||||||
|
} else {
|
||||||
|
var out = new StringJoiner(",\n", "[\n", "\n]");
|
||||||
|
entries.forEach(e -> out.add(indent(e)));
|
||||||
|
return out.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static @NotNull String indent(@NotNull String string) {
|
private static @NotNull String indent(@NotNull String string) {
|
||||||
@ -385,7 +400,7 @@ public record JsonArray(
|
|||||||
|
|
||||||
Iterator<String> it = string.lines().iterator();
|
Iterator<String> it = string.lines().iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
out.append(" ").append(it.next());
|
out.append(Util.PRETTY_PRINT_INDENT).append(it.next());
|
||||||
if (it.hasNext()) out.append('\n');
|
if (it.hasNext()) out.append('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,9 +353,14 @@ public record JsonObject(@NotNull Map<@NotNull String, @Nullable JsonValue> entr
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull String toPrettyJsonString() {
|
public @NotNull String toPrettyJsonString(int depth) {
|
||||||
StringJoiner out = new StringJoiner(",\n ", "{\n ", "\n}");
|
StringJoiner out = new StringJoiner(",\n" + Util.PRETTY_PRINT_INDENT, "{\n" + Util.PRETTY_PRINT_INDENT, "\n}");
|
||||||
entries.forEach((key, value) -> out.add(JsonString.quote(key) + ": " + indent(JsonValue.toPrettyJsonString(value))));
|
entries.forEach((key, value) -> {
|
||||||
|
var keyString = JsonString.quote(key);
|
||||||
|
var valueIdent = depth + Util.PRETTY_PRINT_INDENT.length() + keyString.length() + 3; // +3 for ": " and ","
|
||||||
|
var valueString = JsonValue.toPrettyJsonString(value, valueIdent);
|
||||||
|
out.add(keyString + ": " + indent(valueString));
|
||||||
|
});
|
||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,7 +374,7 @@ public record JsonObject(@NotNull Map<@NotNull String, @Nullable JsonValue> entr
|
|||||||
|
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
String next = it.next();
|
String next = it.next();
|
||||||
out.append('\n').append(it.hasNext() ? " " : " ").append(next);
|
out.append('\n').append(Util.PRETTY_PRINT_INDENT).append(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
return out.toString();
|
return out.toString();
|
||||||
|
@ -24,6 +24,14 @@ public sealed interface JsonValue extends Serializable permits JsonObject, JsonA
|
|||||||
* {@return a prettified JSON representation of this value}
|
* {@return a prettified JSON representation of this value}
|
||||||
*/
|
*/
|
||||||
default @NotNull String toPrettyJsonString() {
|
default @NotNull String toPrettyJsonString() {
|
||||||
|
return toPrettyJsonString(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@return a prettified JSON representation of this value}
|
||||||
|
* @param depth indicates the depth at which this value appears (no formal definition given)
|
||||||
|
*/
|
||||||
|
default @NotNull String toPrettyJsonString(int depth) {
|
||||||
return toJsonString();
|
return toJsonString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,7 +48,16 @@ public sealed interface JsonValue extends Serializable permits JsonObject, JsonA
|
|||||||
* @param value a {@link JsonValue} (possibly {@code null})
|
* @param value a {@link JsonValue} (possibly {@code null})
|
||||||
*/
|
*/
|
||||||
static @NotNull String toPrettyJsonString(@Nullable JsonValue value) {
|
static @NotNull String toPrettyJsonString(@Nullable JsonValue value) {
|
||||||
return value == null ? "null" : value.toPrettyJsonString();
|
return toPrettyJsonString(value, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@return the prettified JSON representation of the given value}
|
||||||
|
* @param value a {@link JsonValue} (possibly {@code null})
|
||||||
|
* @param depth indicates the depth at which the value appears (no formal definition given)
|
||||||
|
*/
|
||||||
|
static @NotNull String toPrettyJsonString(@Nullable JsonValue value, int depth) {
|
||||||
|
return value == null ? "null" : value.toPrettyJsonString(depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,6 +8,9 @@ import java.util.*;
|
|||||||
|
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
class Util {
|
class Util {
|
||||||
|
static final @NotNull String PRETTY_PRINT_INDENT = " ";
|
||||||
|
static final int PRETTY_PRINT_ARRAY_MULTILINE_THRESHOLD = 80;
|
||||||
|
|
||||||
private static final @NotNull Class<?> LIST_1_2 = List.of(1).getClass();
|
private static final @NotNull Class<?> LIST_1_2 = List.of(1).getClass();
|
||||||
private static final @NotNull Class<?> LIST_N = List.of(1, 2, 3).getClass();
|
private static final @NotNull Class<?> LIST_N = List.of(1, 2, 3).getClass();
|
||||||
private static final @NotNull Class<?> SUB_LIST = List.of(1, 2, 3).subList(0, 2).getClass();
|
private static final @NotNull Class<?> SUB_LIST = List.of(1, 2, 3).subList(0, 2).getClass();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user