1

txt ファイルから大量の情報を解析する必要があるユース ケースに遭遇しました。ペイロードの本質はkey:valueペアの集まりであり、開発時にはどれも知りません。

Wombat
Area: "Northern Alberta"
Tank Level (ft): -3.395
Temperature (C): 19.3
Batt Voltage: 13.09
Last Maintained: 2012-01-01
Secured: "Yes"

ご覧のとおり、文字列、数値、日付、およびブール値の可能性があります。ユーザーが特定の属性のルールを作成する必要があるユースケースもあります。

タンク レベルがnを超える場合は、 some.user@someplace.com に通知してください。「アルバータ」を含むサイトが保護
されていない 場合は、 some.user @someplace.comに通知してください。

属性のタイプに応じて、使用可能なルール タイプが異なります。また、数値型に対して何らかの集計を行う必要がある場合もあります。とにかく、簡単に言うと、型情報が必要です。では、どのようなデータ構造が最適でしょうか?

最初は、個別のタプルを使用するつもりでした。

val stringAttributes: Array[(String, String)]
val doubleAttributes: Array[(String, Double)]
val dateAttributes: Array[(String, Date)]

今ではそれは間違っているか、少なくとも醜いようです。それから私は多分次のようなものです:

val attributes: Array[(String, Any)]

今、私は多くの場所でパターンマッチをしています。また、Web アプリケーションとデータベース (MongoDB) に JSON プロトコルを使用していることにも注意してください。フロントエンドに次のようなものを与えると便利です:

{
    site: "Wombat",
    attributes: [
        { "Area": "Northern Alberta" },
        { "Tank Level (ft)": -3.395 },
        { "Temperature (C)": 19.3 }
    ]
}

しかし、バックエンドでは、型をエンコードしますか? 生の JSON を解析しますか? 最後に、Web クライアントとデータベースの両方で JSON をサポートしながら、属性の動的セットの型情報を維持する最善の方法を探しています。

4

1 に答える 1

0

@davidのコメントに+1。

エンドツーエンドで JSON を使用して、個々のルールごとに必要なタイプを導出してみませんか? 次に、1 つの関数を使用して JSON 値を正しい型に変換します (デフォルトを使用するかOption、実際には一致しない場合)。

次に、次のようなものを使用して、解析されたすべてのオブジェクトに対してルールセットを実行できます。

for (object <- parseObjects(); rule <- rules) {
  val value = coerce(object, rule.desiredType)
  rule(value)
}

または、ルール自体に強制コードを呼び出すなど、同様のもの。ルール処理を行うまでは、オブジェクトにタイプを持たせる必要はないように思えます。

PS Typesafe Configは、解析するのが単純な形式のように見えますが、既にファイルを解析できる可能性があります。

于 2013-09-26T20:12:39.667 に答える