Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .sbtopts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-Dsbt.io.implicit.relative.glob.conversion=allow
19 changes: 10 additions & 9 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
lazy val scala212 = "2.12.20"
lazy val scala213 = "2.13.16"
lazy val scala3 = "3.3.5"

Expand Down Expand Up @@ -61,7 +60,7 @@ def crossScalaSettings = {
}

Seq(
crossScalaVersions := Seq(scala212, scala213, scala3),
crossScalaVersions := Seq(scala213, scala3),
Compile / unmanagedSourceDirectories ++= addDirsByScalaVersion(
"src/main"
).value,
Expand Down Expand Up @@ -225,7 +224,7 @@ lazy val `jackson-212` = project
"com.fasterxml.jackson.core" % "jackson-core" % "2.12.7"
)
)
.dependsOn(core)
.dependsOn(core % "compile->compile;test->test")

lazy val `jackson-213` = project
.in(jackson / "jackson-213")
Expand All @@ -239,7 +238,7 @@ lazy val `jackson-213` = project
"com.fasterxml.jackson.core" % "jackson-core" % "2.13.5"
)
)
.dependsOn(core)
.dependsOn(core % "compile->compile;test->test")

lazy val `jackson-214` = project
.in(jackson / "jackson-214")
Expand All @@ -253,7 +252,7 @@ lazy val `jackson-214` = project
"com.fasterxml.jackson.core" % "jackson-core" % "2.14.3"
)
)
.dependsOn(core)
.dependsOn(core % "compile->compile;test->test")

lazy val `jackson-215` = project
.in(jackson / "jackson-215")
Expand All @@ -267,7 +266,7 @@ lazy val `jackson-215` = project
"com.fasterxml.jackson.core" % "jackson-core" % "2.15.4"
)
)
.dependsOn(core)
.dependsOn(core % "compile->compile;test->test")

lazy val `jackson-216` = project
.in(jackson / "jackson-216")
Expand All @@ -281,7 +280,7 @@ lazy val `jackson-216` = project
"com.fasterxml.jackson.core" % "jackson-core" % "2.16.2"
)
)
.dependsOn(core)
.dependsOn(core % "compile->compile;test->test")

lazy val `jackson-217` = project
.in(jackson / "jackson-217")
Expand All @@ -295,7 +294,7 @@ lazy val `jackson-217` = project
"com.fasterxml.jackson.core" % "jackson-core" % "2.17.3"
)
)
.dependsOn(core)
.dependsOn(core % "compile->compile;test->test")

lazy val `jackson-218` = project
.in(jackson / "jackson-218")
Expand All @@ -309,7 +308,7 @@ lazy val `jackson-218` = project
"com.fasterxml.jackson.core" % "jackson-core" % "2.18.3"
)
)
.dependsOn(core)
.dependsOn(core % "compile->compile;test->test")

lazy val benchmarks = project
.in(modules / "benchmarks")
Expand All @@ -327,6 +326,8 @@ lazy val benchmarks = project
"io.circe" %% "circe-jackson210" % "0.14.0",
"dev.zio" %% "zio-json" % "0.7.1",
"com.typesafe.play" %% "play-json" % "2.10.5",
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.33.1",
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.33.1",
"org.knowm.xchart" % "xchart" % "3.8.2" exclude ("de.erichseifert.vectorgraphics2d", "VectorGraphics2D") withSources ()
),
scalacOptions ++= {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import scala.annotation.switch
final class JacksonTokenIterator(jsonParser: JsonParser)
extends BaseTokenIterator {
private[this] var token: Token = fromId(jsonParser.currentTokenId())

override def currentToken(): Token = token

override def nextToken(): Token = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,7 @@ class JacksonTokenWriter(jsonGenerator: JsonGenerator) extends TokenWriter {
override def close(): Unit = jsonGenerator.close()

override def flush(): Unit = jsonGenerator.flush()

override def result(): String =
jsonGenerator.getOutputTarget.toString
}
Original file line number Diff line number Diff line change
@@ -1,36 +1,81 @@
package tethys

import java.io.{Reader, Writer}

import com.fasterxml.jackson.core.JsonFactory
import java.io.Reader
import com.fasterxml.jackson.core.{
JsonFactory,
JsonFactoryBuilder,
JsonGenerator
}
import tethys.readers.{FieldName, ReaderError}
import tethys.readers.tokens.{TokenIterator, TokenIteratorProducer}
import tethys.writers.tokens.{TokenWriter, TokenWriterProducer}
import tethys.writers.tokens.{
TokenWriter,
TokenWriterConfig,
TokenWriterProducer
}

package object jackson {
lazy val defaultJsonFactory: JsonFactory = {
val f = new JsonFactory()
f.configure(JsonFactory.Feature.INTERN_FIELD_NAMES, false)
f
lazy val defaultJsonFactory: JsonFactory =
new JsonFactoryBuilder()
.configure(JsonFactory.Feature.INTERN_FIELD_NAMES, false)
.build()

class JacksonTokenWriterProducer(
jsonFactory: JsonFactory,
// used for compatibility where tethys.jackson.pretty import is required
modifyConfig: TokenWriterConfig => TokenWriterConfig
) extends TokenWriterProducer {

private def updateGeneratorFromConfig(
generator: JsonGenerator,
config: TokenWriterConfig
): JsonGenerator = {
if (config == TokenWriterConfig.default)
generator
else {
val first =
if (config.indentionStep == 2)
generator.useDefaultPrettyPrinter()
else
generator

val second =
if (config.escapeUnicode)
first.setHighestNonEscapedChar(127)
else
first
second
}
}

override def produce(config: TokenWriterConfig): TokenWriter = {
val generator = updateGeneratorFromConfig(
jsonFactory.createGenerator(new java.io.StringWriter()),
modifyConfig(config)
)
new JacksonTokenWriter(generator)
}
}

implicit def jacksonTokenWriterProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
): TokenWriterProducer = new TokenWriterProducer {
override def forWriter(writer: Writer): TokenWriter = {
new JacksonTokenWriter(jsonFactory.createGenerator(writer))
}
}
): JacksonTokenWriterProducer =
new JacksonTokenWriterProducer(jsonFactory, identity)

implicit def jacksonTokenIteratorProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
): TokenIteratorProducer = new TokenIteratorProducer {
override def produce(json: String): Either[ReaderError, TokenIterator] =
ReaderError.catchNonFatal(
JacksonTokenIterator.fromFreshParser(jsonFactory.createParser(json))
)(FieldName.Root)

override def fromReader(
reader: Reader
): Either[ReaderError, TokenIterator] = {
ReaderError.catchNonFatal(
JacksonTokenIterator.fromFreshParser(jsonFactory.createParser(reader))
)(FieldName())
)(FieldName.Root)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package tethys.jackson

import java.io.Writer

import com.fasterxml.jackson.core.JsonFactory
import tethys.readers.tokens.TokenIteratorProducer
import tethys.writers.tokens.{TokenWriter, TokenWriterProducer}

package object pretty {

@deprecated("Provide implicit TokenWriterConfig to `asJson` instead")
implicit def prettyJacksonTokenWriterProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
): TokenWriterProducer = new TokenWriterProducer {
override def forWriter(writer: Writer): TokenWriter = {
new JacksonTokenWriter(
jsonFactory.createGenerator(writer).useDefaultPrettyPrinter()
)
}
}
): JacksonTokenWriterProducer =
new tethys.jackson.JacksonTokenWriterProducer(
jsonFactory,
modifyConfig = _.withDefaultPrettyPrinter
)

implicit def jacksonTokenIteratorProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package tethys.jackson

import tethys.JsonReaderSpec
import tethys.readers.tokens.TokenIteratorProducer

class JacksonJsonReaderSpec extends JsonReaderSpec {
def producer: TokenIteratorProducer = jacksonTokenIteratorProducer
}
Loading
Loading