55package play .api .libs .json
66
77import com .fasterxml .jackson .core .StreamReadConstraints
8+ import com .fasterxml .jackson .core .StreamWriteConstraints
89
910import play .api .libs .json .JsonConfig .defaultMaxPlain
1011import play .api .libs .json .JsonConfig .defaultMinPlain
@@ -106,6 +107,7 @@ sealed trait JsonConfig {
106107 def bigDecimalParseConfig : BigDecimalParseConfig
107108 def bigDecimalSerializerConfig : BigDecimalSerializerConfig
108109 def streamReadConstraints : StreamReadConstraints
110+ def streamWriteConstraints : StreamWriteConstraints
109111}
110112
111113object JsonConfig {
@@ -176,6 +178,11 @@ object JsonConfig {
176178 */
177179 val maxNestingDepth : String = " play.json.parser.maxNestingDepth"
178180
181+ /**
182+ * The system property to override the max nesting depth for JSON serialization.
183+ */
184+ val maxSerializerNestingDepth : String = " play.json.serializer.maxNestingDepth"
185+
179186 /**
180187 * The system property to override the max string length for JSON parsing.
181188 * This is used to limit the length of individual strings in JSON documents.
@@ -200,6 +207,9 @@ object JsonConfig {
200207 private [json] def loadMaxNestingDepth : Int =
201208 prop(maxNestingDepth, StreamReadConstraints .DEFAULT_MAX_DEPTH )(Integer .parseInt)
202209
210+ private [json] def loadMaxSerializerNestingDepth : Int =
211+ prop(maxSerializerNestingDepth, StreamWriteConstraints .DEFAULT_MAX_DEPTH )(Integer .parseInt)
212+
203213 private [json] def loadMaxStringLength : Int =
204214 prop(maxStringLength, StreamReadConstraints .DEFAULT_MAX_STRING_LEN )(Integer .parseInt)
205215
@@ -214,13 +224,20 @@ object JsonConfig {
214224 .maxNumberLength(Int .MaxValue ) // play-json has its own support for limiting number length
215225 .build()
216226
227+ private [json] val defaultStreamWriteConstraints : StreamWriteConstraints =
228+ StreamWriteConstraints
229+ .builder()
230+ .maxNestingDepth(loadMaxSerializerNestingDepth)
231+ .build()
232+
217233 // Default settings, which can be controlled with system properties.
218234 // To override, call JacksonJson.setConfig()
219235 val settings : JsonConfig =
220236 JsonConfig (
221237 BigDecimalParseConfig (loadMathContext, loadScaleLimit, loadDigitsLimit),
222238 BigDecimalSerializerConfig (loadMinPlain, loadMaxPlain, loadPreserveZeroDecimal),
223- defaultStreamReadConstraints
239+ defaultStreamReadConstraints,
240+ defaultStreamWriteConstraints
224241 )
225242
226243 def apply (): JsonConfig = apply(BigDecimalParseConfig (), BigDecimalSerializerConfig ())
@@ -229,14 +246,20 @@ object JsonConfig {
229246 bigDecimalParseConfig : BigDecimalParseConfig ,
230247 bigDecimalSerializerConfig : BigDecimalSerializerConfig
231248 ): JsonConfig =
232- JsonConfigImpl (bigDecimalParseConfig, bigDecimalSerializerConfig, defaultStreamReadConstraints)
249+ JsonConfigImpl (
250+ bigDecimalParseConfig,
251+ bigDecimalSerializerConfig,
252+ defaultStreamReadConstraints,
253+ defaultStreamWriteConstraints
254+ )
233255
234256 def apply (
235257 bigDecimalParseConfig : BigDecimalParseConfig ,
236258 bigDecimalSerializerConfig : BigDecimalSerializerConfig ,
237- streamReadConstraints : StreamReadConstraints
259+ streamReadConstraints : StreamReadConstraints ,
260+ streamWriteConstraints : StreamWriteConstraints
238261 ): JsonConfig =
239- JsonConfigImpl (bigDecimalParseConfig, bigDecimalSerializerConfig, streamReadConstraints)
262+ JsonConfigImpl (bigDecimalParseConfig, bigDecimalSerializerConfig, streamReadConstraints, streamWriteConstraints )
240263
241264 private [json] def parseMathContext (key : String ): MathContext = sys.props.get(key).map(_.toLowerCase) match {
242265 case Some (" decimal128" ) => MathContext .DECIMAL128
@@ -257,5 +280,6 @@ object JsonConfig {
257280private final case class JsonConfigImpl (
258281 bigDecimalParseConfig : BigDecimalParseConfig ,
259282 bigDecimalSerializerConfig : BigDecimalSerializerConfig ,
260- streamReadConstraints : StreamReadConstraints
283+ streamReadConstraints : StreamReadConstraints ,
284+ streamWriteConstraints : StreamWriteConstraints
261285) extends JsonConfig
0 commit comments