Skip to content

Commit 4ff4710

Browse files
committed
Add weejson-jsoniter-scala
1 parent 82824fb commit 4ff4710

File tree

4 files changed

+396
-0
lines changed

4 files changed

+396
-0
lines changed

build.sbt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ lazy val bench = project
1010
.dependsOn(
1111
`weepickle-tests` % "compile;test",
1212
`weejson-upickle`,
13+
`weejson-jsoniter-scala`,
1314
)
1415
.enablePlugins(JmhPlugin)
1516
.settings(
@@ -137,6 +138,27 @@ lazy val `weejson-jackson` = project
137138
)
138139
)
139140

141+
/**
142+
* A very fast JSON parser.
143+
*
144+
* Uses MiMa, but not shaded. Package naming strategy across major versions is unknown.
145+
*
146+
* @see https://github.com/plokhotnyuk/jsoniter-scala
147+
*/
148+
lazy val `weejson-jsoniter-scala` = project
149+
.dependsOn(`weepickle-core`)
150+
.settings(
151+
libraryDependencies ++= Seq(
152+
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.12.0"
153+
),
154+
mimaPreviousArtifacts := {
155+
if (VersionNumber(version.value).matchesSemVer(SemanticSelector("<1.8.0")))
156+
Set.empty
157+
else
158+
mimaPreviousArtifacts.value
159+
}
160+
)
161+
140162
lazy val `weejson-circe` = project
141163
.dependsOn(weejson)
142164
.settings(
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.rallyhealth.weejson.v1.wee_jsoniter_scala
2+
3+
import com.github.plokhotnyuk.jsoniter_scala.core._
4+
import com.rallyhealth.weejson.v1.wee_jsoniter_scala.WeePickleJsonValueCodecs.VisitorJsonValueEncoder
5+
import com.rallyhealth.weepickle.v1.core.{FromInput, Visitor}
6+
7+
import java.io.InputStream
8+
import java.nio.ByteBuffer
9+
10+
/**
11+
* A very fast UTF-8-only JSON parser.
12+
*
13+
* This integration:
14+
* - tracks paths and returns as JsonPointer
15+
* - does not deduplicate strings
16+
* - throws below a fixed depth limit
17+
*
18+
* @see https://github.com/plokhotnyuk/jsoniter-scala
19+
*/
20+
object FromJsoniterScala extends FromJsoniterScala(ReaderConfig)
21+
22+
class FromJsoniterScala(config: ReaderConfig) {
23+
24+
def apply(
25+
bytes: Array[Byte]
26+
): FromInput = new FromInput {
27+
28+
override def transform[T](
29+
to: Visitor[_, T]
30+
): T = readFromArray(bytes, config)(readerCodec(to))
31+
}
32+
33+
def apply(
34+
in: InputStream
35+
): FromInput = new FromInput {
36+
37+
override def transform[T](
38+
to: Visitor[_, T]
39+
): T = readFromStream(in, config)(readerCodec(to))
40+
}
41+
42+
def apply(
43+
buf: ByteBuffer
44+
): FromInput = new FromInput {
45+
46+
override def transform[T](
47+
to: Visitor[_, T]
48+
): T = readFromByteBuffer(buf, config)(readerCodec(to))
49+
}
50+
51+
private def readerCodec[J](
52+
v: Visitor[_, J]
53+
): JsonValueCodec[J] = new VisitorJsonValueEncoder[J](v, maxDepth = 64)
54+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package com.rallyhealth.weejson.v1.wee_jsoniter_scala
2+
3+
import com.github.plokhotnyuk.jsoniter_scala.core.JsonWriter
4+
import com.rallyhealth.weepickle.v1.core._
5+
6+
import java.time.Instant
7+
8+
class JsonWriterVisitor(
9+
writer: JsonWriter
10+
) extends JsVisitor[Any, JsonWriter] {
11+
12+
private[this] val arrVisitor = new ArrVisitor[Any, JsonWriter] {
13+
override def subVisitor: Visitor[_, _] = JsonWriterVisitor.this
14+
15+
override def visitValue(
16+
v: Any
17+
): Unit = ()
18+
19+
override def visitEnd(): JsonWriter = {
20+
writer.writeArrayEnd()
21+
writer
22+
}
23+
}
24+
25+
private[this] val objVisitor = new ObjVisitor[Any, JsonWriter] {
26+
writer.writeObjectStart()
27+
override def visitKey(): Visitor[_, _] = StringVisitor
28+
29+
override def visitKeyValue(
30+
v: Any
31+
): Unit = writer.writeKey(v.toString)
32+
33+
override def subVisitor: Visitor[_, _] = JsonWriterVisitor.this
34+
35+
override def visitValue(
36+
v: Any
37+
): Unit = ()
38+
39+
override def visitEnd(): JsonWriter = {
40+
writer.writeObjectEnd()
41+
writer
42+
}
43+
}
44+
45+
override def visitArray(
46+
length: Int
47+
): ArrVisitor[Any, JsonWriter] = arrVisitor
48+
49+
override def visitObject(
50+
length: Int
51+
): ObjVisitor[Any, JsonWriter] = objVisitor
52+
53+
override def visitNull(): JsonWriter = {
54+
writer.writeNull()
55+
writer
56+
}
57+
58+
override def visitFalse(): JsonWriter = {
59+
writer.writeVal(false)
60+
writer
61+
}
62+
63+
override def visitTrue(): JsonWriter = {
64+
writer.writeVal(true)
65+
writer
66+
}
67+
68+
override def visitFloat64StringParts(
69+
cs: CharSequence,
70+
decIndex: Int,
71+
expIndex: Int
72+
): JsonWriter = {
73+
writer.writeNonEscapedAsciiVal(cs.toString)
74+
writer
75+
}
76+
77+
override def visitFloat64(
78+
d: Double
79+
): JsonWriter = {
80+
writer.writeVal(d)
81+
writer
82+
}
83+
84+
override def visitFloat32(
85+
d: Float
86+
): JsonWriter = {
87+
writer.writeVal(d)
88+
writer
89+
}
90+
91+
override def visitInt32(
92+
i: Int
93+
): JsonWriter = {
94+
writer.writeVal(i)
95+
writer
96+
}
97+
98+
override def visitInt64(
99+
l: Long
100+
): JsonWriter = {
101+
writer.writeVal(l)
102+
writer
103+
}
104+
105+
override def visitFloat64String(
106+
s: String
107+
): JsonWriter = {
108+
writer.writeNonEscapedAsciiVal(s)
109+
writer
110+
}
111+
112+
override def visitString(
113+
cs: CharSequence
114+
): JsonWriter = {
115+
writer.writeVal(cs.toString)
116+
writer
117+
}
118+
119+
override def visitChar(
120+
c: Char
121+
): JsonWriter = {
122+
writer.writeVal(c)
123+
writer
124+
}
125+
126+
override def visitTimestamp(
127+
instant: Instant
128+
): JsonWriter = {
129+
writer.writeVal(instant)
130+
writer
131+
}
132+
133+
override def visitBinary(
134+
bytes: Array[Byte],
135+
offset: Int,
136+
len: Int
137+
): JsonWriter = {
138+
val trimmed = if (bytes.length != len) bytes.take(len) else bytes
139+
writer.writeBase64Val(trimmed, true)
140+
writer
141+
}
142+
}

0 commit comments

Comments
 (0)