1

こんにちは、ドキュメントの Decode Person の例は、JSON にキーと値があり、キー名を使用してその値を抽出できる場合は素晴らしいですが、キーを構成する文字列が任意だが意味がある場合はどうでしょう。

Fxample の 1 つのオープンな暗号通貨 API は、コインの履歴価格を提供でき、返される JSON の構造は、要求しているコインの基本通貨と、価格を設定したいさまざまな見積もり通貨によって異なります..たとえば、 「AUD」と「XRP」の「DOGE」の特定の日付での価格が必要です。返される JSON は次のようになります

{"DOGE":{"AUD":0.008835,"XRP":0.004988}}

ベースに移動してその値を取得してから価格を取得することはできません.JSONはそのように構造化されていないため、キーとして「DOGE」を探す必要があります。 'キーと'XRP'キー。そしてもちろん、クエリに応じて結果ごとに異なります。

もちろん、それらに基づいて検索を作成するときにこれらのキーを知っていますが、Argonaut を使用してこの JSON を解析するにはどうすればよいでしょうか? どうにかしてキー名を閉じる Decode を作成できますか?

ヘルプやガイダンスをいただければ幸いです。

4

2 に答える 2

1

Fried Brice's answer に従って、解析ルートをたどり、結果のいずれかをマッピングして、データ型を生成しました。以下のコード スニペットを参照してください。提案、改善を歓迎します。

def parseHistoricPriceJSON(rawJson: String, fromcurrency: Currency, toCurrencies: List[Currency]): Either[String, PricedAsset] = {
import argonaut._, Argonaut._
import monocle.macros.syntax.lens._
val parsed: Either[String, Json] = Parse.parse(rawJson)
val myTocurrs = Currency("XRP") :: toCurrencies

parsed.right.map(outer => {
  val cursor = outer.cursor
  val ps = for {
    toC <- myTocurrs
    prices <- cursor.downField(fromcurrency.sym)
    price <- prices.downField(toC.sym)
    thep <- price.focus.number
  } yield (toC, thep.toDouble.get)

  PricedAsset(fromcurrency, ps)
})

}

case class Currency(sym: String) extends AnyVal {
  def show = sym
}

case class PricedAsset(base:Currency, quotePrices: List[(Currency,Double)])
于 2018-03-13T03:14:04.417 に答える