Я пытаюсь создать читателей Json в приложении Play Framework (Scala). Проблема в том, что часть моего Json немного напуганна и требует дальнейшей обработки для извлечения значений. Например:Play Json - Создание сложного объекта
{
"field1":"value1",
"field2":"value/1",
"num2":2
}
с тематическими классами:
case class Field1(text: String, fields: Field2)
case class Field2(text: String, num: Int, num2: Int)
В основном text
и num
поля для Field2
является производным от значения value/1
, путем разделения текста. Вот функция разветвителя:
def splitter(path: String, num2: Int): Field2 = {
val split = path.split("\\")
Field2(split(0), split(1).toInt, num2)
}
Это довольно просто, фактическая функция сплиттера является гораздо более сложным. В принципе единственный способ построить этот объект Field2
- передать одну строку функции, которая выплескивает необходимый объект.
Как я могу создать считыватель для Field2
(и по расширению для Field1
)?
Вот что я до сих пор:
object Field1 {
implicit val reader = (
(__ \ "field1").read[String] and
(__).read[Field2]
) (Field1.apply _)
}
object Field2 {
implicit val reader = (
splitter((__ \ "field2").read[String], (__ \ "num2"))
) // Obviously incorrect syntax + type mismatch, but this is roughly what I'm trying to accomplish.
}
Это прекрасно работает. Но нет ли способа использовать регулярный функциональный синтаксис? Я использовал это в других битах моего кода, и я бы хотел, чтобы все было согласовано. – Jeff
@Jeff Проблема с функциональным синтаксисом заключается в том, что вы не можете ссылаться на предыдущие поля, чтобы вычислить вещи. Как только вы назовете применить, вы можете изменить созданный Reader, но вам нужен промежуточный тип для отслеживания данных, которые вы вычислили. Кроме того, при определенных обстоятельствах вы можете столкнуться с проблемами производительности с функциональным синтаксисом: https://www.lucidchart.com/techblog/2016/08/29/speeding-up-restful-services-in-play-framework/ – gregghz
@Jeff Я добавил пример, который использует функциональный синтаксис. – gregghz