Skip to content

Commit

Permalink
handle token reading issue in ScalaObjectDeserializer
Browse files Browse the repository at this point in the history
  • Loading branch information
pjfanning committed Jan 30, 2025
1 parent 9c1fa54 commit 877a842
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.fasterxml.jackson.module.scala.deser

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.{JsonParser, JsonToken}
import com.fasterxml.jackson.databind.deser.Deserializers
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
import com.fasterxml.jackson.databind._
Expand All @@ -11,7 +11,14 @@ import scala.languageFeature.postfixOps
import scala.util.control.NonFatal

private class ScalaObjectDeserializer(value: Any) extends StdDeserializer[Any](classOf[Any]) {
override def deserialize(p: JsonParser, ctxt: DeserializationContext): Any = value
override def deserialize(p: JsonParser, ctxt: DeserializationContext): Any = {
if (p.currentToken() != JsonToken.END_OBJECT) {
while (p.nextToken() != JsonToken.END_OBJECT) {
// consume the object
}
}
value
}
}

private object ScalaObjectDeserializerResolver extends Deserializers.Base {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.fasterxml.jackson.module.scala.deser

import com.fasterxml.jackson.annotation.{JsonAutoDetect, PropertyAccessor}
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.scala.{ClassTagExtensions, DefaultScalaModule}
import com.fasterxml.jackson.module.scala.deser.CaseObjectDeserializerTest.{Foo, TestObject}
Expand All @@ -25,6 +26,17 @@ class CaseObjectDeserializerTest extends DeserializerTest {
assert(deserialized === original)
}

it should "deserialize a case object and not create a new instance (FAIL_ON_TRAILING_TOKENS enabled)" in {
val mapper = newBuilder
.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS)
.build()
val original = TestObject
val json = mapper.writeValueAsString(original)
json shouldEqual "{}"
val deserialized = mapper.readValue(json, TestObject.getClass)
assert(deserialized === original)
}

it should "deserialize Foo and not create a new instance" in {
val mapper = JsonMapper.builder().addModule(DefaultScalaModule).addModule(ScalaObjectDeserializerModule).build()
val original = Foo
Expand Down

0 comments on commit 877a842

Please sign in to comment.