Интеграция потребителей Zio-Kafka с десериализатором Zio-Json
Я изучаю библиотеку
zio-kafka
, и я хочу использовать
zio-json
для десериализации значений сообщений в формате JSON.
У меня есть простой класс case вместе с его декодером и кодировщиком:
case class Player(name: String, score: Int)
object Player {
implicit val decoder: JsonDecoder[Player] = DeriveJsonDecoder.gen[Player]
implicit val encoder: JsonEncoder[Player] = DeriveJsonEncoder.gen[Player]
}
Прямо сейчас я создал
Serde
начиная с
Serde.string
который использует указанный выше декодер / кодировщик:
val playerSerde: Serde[Any, Player] = Serde.string.inmapM { playerAsString =>
ZIO.fromEither(playerAsString.fromJson[Match].left.map(new RuntimeException(_)))
} { playerAsObj =>
ZIO.effect(playerAsObj.toJson)
}
Это правильно? Есть ли другой (лучший) подход?
1 ответ
Рассмотрите возможность использования
.getOrElse
поскольку я думаю, что это немного проясняет намерение и позволяет избежать открытого доступа к левому полю:
val playerSerde: Serde[Any, Player] = Serde.string.inmapM { playerAsString =>
ZIO.effectTotal(playerAsString.fromJson[Player].getOrElse(throw new Error))
}(playerAsObj => ZIO.effect(playerAsObj.toJson))
Я также предположил, что вы имели в виду
.fromJson[Player]
поскольку я не видел
Match
класс в любом месте вашего вопроса.