В настоящее время я создаю очень простой парсер JSON в Scala, который имеет дело с двумя (немного) разными схемами. Моя цель - проанализировать одно значение в json, и на основе этого значения я хотел бы отправить его соответствующему декодеру. Я использовал circe для своей реализации, но другие реализации и / или предложения также приветствуются.
Я сформулировал упрощенную версию для своего примера, чтобы помочь прояснить вопрос.
Есть два типа из JSON, которые я могу получить, либо акцию:
"data": {
"name": "XYZ"
},
"type": "STOCK"
}
, либо цитату (которая аналогична акции, но включает цену).
"data": {
"name": "ABC",
"price": 1151.6214,
},
"type": "QUOTE"
}
Со своей стороны, я разработали простой декодер, который выглядит так (для акций):
implicit private val dataDecoder: Decoder[Stock] = (hCursor: HCursor) => {
for {
isin <- hCursor.downField("data").downField("name").as[String]
typ <- hCursor.downField("type").as[StockType]
} yield Instrument(name, typ, LocalDateTime.now())
}
Я мог бы также разработать синтаксический анализатор, который анализирует только "тип" части JSON, а затем отправляет данные в обрабатываться соответствующим парсером (котировкой или акцией). Однако мне интересно, что такое:
- Эффективный способ сделать это
- Идиоматический / чистый способ сделать это
Чтобы помочь перефразировать мой вопрос при необходимости, каков правильный и эффективный способ обработки слегка отличающихся схем JSON и пересылки их для обработки правильному синтаксическому анализатору.