Skip to content

Instantly share code, notes, and snippets.

@negokaz
Last active July 9, 2021 02:31
Show Gist options
  • Save negokaz/f2d9047f1986e94f687c2fd9d8bce841 to your computer and use it in GitHub Desktop.
Save negokaz/f2d9047f1986e94f687c2fd9d8bce841 to your computer and use it in GitHub Desktop.
[spray-json] JsonFormat to process more than 22 fields
/*
* case class を分割する方法
*/
import spray.json._
case class Document1(field1: String, field2: String, field3: String, field4: String, field5: String,
field6: String, field7: String, field8: String, field9: String, field10: String,
field11: String, field12: String, field13: String, field14: String, field15: String,
field16: String, field17: String, field18: String, field19: String, field20: String)
case class Document2(field21: String, field22: String, field23: String, field24: String, field25: String)
case class RootDocument(doc1: Document1, doc2: Document2)
object DocumentProtocol extends DefaultJsonProtocol {
implicit val document1Format: JsonFormat[Document1] = jsonFormat20(Document1)
implicit val document2Format: JsonFormat[Document2] = jsonFormat5(Document2)
implicit object DocumentFormat extends RootJsonFormat[RootDocument] {
override def write(obj: RootDocument): JsValue = {
val objFields1 = obj.doc1.toJson.asJsObject.fields
val objFields2 = obj.doc2.toJson.asJsObject.fields
val duplicateKeys = objFields1.keySet.intersect(objFields2.keySet)
require(duplicateKeys.isEmpty, s"duplicate key found: ${duplicateKeys}")
JsObject(objFields1 ++ objFields2)
}
def read(json: JsValue): RootDocument = {
RootDocument(json.convertTo[Document1], json.convertTo[Document2])
}
}
}
import DocumentProtocol._
val obj = RootDocument(
Document1(
"field1", "field2", "field3", "field4", "field5",
"field6", "field7", "field8", "field9", "field10",
"field11", "field12", "field13", "field14", "field15",
"field16", "field17", "field18", "field19", "field20"
),
Document2(
"field21", "field22", "field23", "field24", "field25"
)
)
println(obj.toJson.toString())
val json =
"""
|{
| "field1":"field1",
| "field2":"field2",
| "field3":"field3",
| "field4":"field4",
| "field5":"field5",
| "field6":"field6",
| "field7":"field7",
| "field8":"field8",
| "field9":"field9",
| "field10":"field10",
| "field11":"field11",
| "field12":"field12",
| "field13":"field13",
| "field14":"field14",
| "field15":"field15",
| "field16":"field16",
| "field17":"field17",
| "field18":"field18",
| "field19":"field19",
| "field20":"field20",
| "field21":"field21",
| "field22":"field22",
| "field23":"field23",
| "field24":"field24",
| "field25":"field25"
|}
""".stripMargin
println(json.parseJson.convertTo[RootDocument])
/*
* case class を頑張って実装する方法
*/
import spray.json._
case class RootDocument(field1: String, field2: String, field3: String, field4: String, field5: String,
field6: String, field7: String, field8: String, field9: String, field10: String,
field11: String, field12: String, field13: String, field14: String, field15: String,
field16: String, field17: String, field18: String, field19: String, field20: String,
field21: String, field22: String, field23: String, field24: String, field25: String)
object DocumentProtocol extends DefaultJsonProtocol {
implicit object DocumentFormat extends RootJsonFormat[RootDocument] {
override def write(obj: RootDocument): JsValue = {
JsObject(
"field1" -> obj.field1.toJson,
"field2" -> obj.field2.toJson,
"field3" -> obj.field3.toJson,
"field4" -> obj.field4.toJson,
"field5" -> obj.field5.toJson,
"field6" -> obj.field6.toJson,
"field7" -> obj.field7.toJson,
"field8" -> obj.field8.toJson,
"field9" -> obj.field9.toJson,
"field10" -> obj.field10.toJson,
"field11" -> obj.field11.toJson,
"field12" -> obj.field12.toJson,
"field13" -> obj.field13.toJson,
"field14" -> obj.field14.toJson,
"field15" -> obj.field15.toJson,
"field16" -> obj.field16.toJson,
"field17" -> obj.field17.toJson,
"field18" -> obj.field18.toJson,
"field19" -> obj.field19.toJson,
"field20" -> obj.field20.toJson,
"field21" -> obj.field21.toJson,
"field22" -> obj.field22.toJson,
"field23" -> obj.field23.toJson,
"field24" -> obj.field24.toJson,
"field25" -> obj.field25.toJson
)
}
def read(json: JsValue): RootDocument = {
val fields = json.asJsObject.fields
RootDocument(
field1 = fields("field1").convertTo[String],
field2 = fields("field2").convertTo[String],
field3 = fields("field3").convertTo[String],
field4 = fields("field4").convertTo[String],
field5 = fields("field5").convertTo[String],
field6 = fields("field6").convertTo[String],
field7 = fields("field7").convertTo[String],
field8 = fields("field8").convertTo[String],
field9 = fields("field9").convertTo[String],
field10 = fields("field10").convertTo[String],
field11 = fields("field11").convertTo[String],
field12 = fields("field12").convertTo[String],
field13 = fields("field13").convertTo[String],
field14 = fields("field14").convertTo[String],
field15 = fields("field15").convertTo[String],
field16 = fields("field16").convertTo[String],
field17 = fields("field17").convertTo[String],
field18 = fields("field18").convertTo[String],
field19 = fields("field19").convertTo[String],
field20 = fields("field20").convertTo[String],
field21 = fields("field21").convertTo[String],
field22 = fields("field22").convertTo[String],
field23 = fields("field23").convertTo[String],
field24 = fields("field24").convertTo[String],
field25 = fields("field25").convertTo[String]
)
}
}
}
import DocumentProtocol._
val obj = RootDocument(
"field1", "field2", "field3", "field4", "field5",
"field6", "field7", "field8", "field9", "field10",
"field11", "field12", "field13", "field14", "field15",
"field16", "field17", "field18", "field19", "field20",
"field21", "field22", "field23", "field24", "field25"
)
println(obj.toJson.toString())
val json =
"""
|{
| "field1":"field1",
| "field2":"field2",
| "field3":"field3",
| "field4":"field4",
| "field5":"field5",
| "field6":"field6",
| "field7":"field7",
| "field8":"field8",
| "field9":"field9",
| "field10":"field10",
| "field11":"field11",
| "field12":"field12",
| "field13":"field13",
| "field14":"field14",
| "field15":"field15",
| "field16":"field16",
| "field17":"field17",
| "field18":"field18",
| "field19":"field19",
| "field20":"field20",
| "field21":"field21",
| "field22":"field22",
| "field23":"field23",
| "field24":"field24",
| "field25":"field25"
|}
""".stripMargin
println(json.parseJson.convertTo[RootDocument])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment