Last active
July 9, 2021 02:31
-
-
Save negokaz/f2d9047f1986e94f687c2fd9d8bce841 to your computer and use it in GitHub Desktop.
[spray-json] JsonFormat to process more than 22 fields
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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