4747 */
4848class JsonValueWriter {
4949
50+ private static final int DEFAULT_MAX_NESTING_DEPTH = 500 ;
51+
5052 private final Appendable out ;
5153
54+ private final int maxNestingDepth ;
55+
5256 private MemberPath path = MemberPath .ROOT ;
5357
5458 private final Deque <JsonWriterFiltersAndProcessors > filtersAndProcessors = new ArrayDeque <>();
@@ -60,7 +64,18 @@ class JsonValueWriter {
6064 * @param out the {@link Appendable} used to receive the JSON output
6165 */
6266 JsonValueWriter (Appendable out ) {
67+ this (out , DEFAULT_MAX_NESTING_DEPTH );
68+ }
69+
70+ /**
71+ * Create a new {@link JsonValueWriter} instance.
72+ * @param out the {@link Appendable} used to receive the JSON output
73+ * @param maxNestingDepth the maximum allowed nesting depth for JSON objects and
74+ * arrays
75+ */
76+ JsonValueWriter (Appendable out , int maxNestingDepth ) {
6377 this .out = out ;
78+ this .maxNestingDepth = maxNestingDepth ;
6479 }
6580
6681 void pushProcessors (JsonWriterFiltersAndProcessors jsonProcessors ) {
@@ -115,10 +130,7 @@ else if (value instanceof WritableJson writableJson) {
115130 throw new UncheckedIOException (ex );
116131 }
117132 }
118- else if (value instanceof Path p ) {
119- writeString (p .toString ());
120- }
121- else if (value instanceof Iterable <?> iterable ) {
133+ else if (value instanceof Iterable <?> iterable && canWriteAsArray (iterable )) {
122134 writeArray (iterable ::forEach );
123135 }
124136 else if (ObjectUtils .isArray (value )) {
@@ -135,6 +147,10 @@ else if (value instanceof Number || value instanceof Boolean) {
135147 }
136148 }
137149
150+ private <V > boolean canWriteAsArray (Iterable <?> iterable ) {
151+ return !(iterable instanceof Path );
152+ }
153+
138154 /**
139155 * Start a new {@link Series} (JSON object or array).
140156 * @param series the series to start
@@ -144,6 +160,10 @@ else if (value instanceof Number || value instanceof Boolean) {
144160 */
145161 void start (Series series ) {
146162 if (series != null ) {
163+ int nestingDepth = this .activeSeries .size ();
164+ Assert .state (nestingDepth <= this .maxNestingDepth ,
165+ () -> "JSON nesting depth (%s) exceeds maximum depth of %s (current path: %s)"
166+ .formatted (nestingDepth , this .maxNestingDepth , this .path ));
147167 this .activeSeries .push (new ActiveSeries (series ));
148168 append (series .openChar );
149169 }
0 commit comments