Table of Contents
Parsing 🔗
Let's start with a simple case class MyData.
The class needs to derive the JsonRW typeclass.
import ba.sake.tupson.{given, *}
case class MyData(
bln: Boolean,
int: Int,
s: String
) derives JsonRW
Then, you can call parseJson[T] function on a String to parse it to the desired type:
val res = """{ "bln":true, "int":5, "s":"dsds" }""".parseJson[MyData]
// MyData(true,5,dsds)
General errors 🔗
If parsing fails you will get a TupsonException:
"""{ "bln":true """.parseJson[MyData]
// TupsonException: incomplete JSON
Specific errors 🔗
Tupson will give you the most specific error(s) as possible:
"""{ "bln":123 }""" .parseJson[MyData]
// Key '$.bln' with value '123' should be Boolean but it is Number; Key '$.int' is missing; Key '$.s' is missing
Collecting errors 🔗
You can catch ParsingException to collect the errors.
This exception contains errors: Seq[ParseError], list of errors that happened while parsing.
Every ParseError object contains a JSONPath path to the field which has errors in it.
You saw some of it in the error stacktrace above.
try {
"""{ "bln":123 } """ .parseJson[MyData]
} catch {
case pe: ParsingException =>
val errors = pe.errors.mkString("\\n")
println(s"errors:\\n${errors}")
}
// errors:
// ParseError($.bln,should be Boolean but it is Number,Some(123))
// ParseError($.int,is missing,None)
// ParseError($.s,is missing,None)