4

Lift-json を使用してケース クラスにマーシャリングする前に、json にキー/値のリストが含まれていることを検証したいと思います。データがネストされている可能性があります。

例えば:

{ 
 "name": "stack",
 "desc": "desc",
 "age": 29,
 "address": {
  "street": "123 elm", 
  "postal_code": 22222,
  "city": "slc",
 }
}

この JSON に「name」、「age」、「address\street」の値が含まれていることを確認するにはどうすればよいですか? 他のすべてのフィールドはオプションであると想定します。

明らかな何かが欠けている場合は申し訳ありませんが、このような問題は以前に解決されていると思います。

ところで、オーダリーを試した人はいますか? https://github.com/nparry/orderly4jvm

4

5 に答える 5

4

ご覧のとおり、いくつかのオプションがあります。

  1. lift-json の「Low level pull parser API」 (このページでそのフレーズを検索) を使用して、関心のある各フィールドを取得できます。End トークンに遭遇した時点で必要なすべてのフィールドを取得していない場合は、例外をスローします。必要なフィールドがある場合は、オブジェクトを作成します。

    Pro : これは JSON を 1 回だけ解析します。これは、lift-json を使用する最もパフォーマンスの高い方法です。

    短所: もろい手巻きのソフトウェアを作成してしまいました。

  2. Lift-json の JsonAST を使用できます。これは、そのメソッドを呼び出した通常の結果(このページparseで「JSON の解析」を検索) と、その XPath に似た式 (このページで「XPath + HOF」を検索) を使用して特定できます。必須フィールドが存在する場合。そうである場合は、適切なフィールドをコンストラクターに渡してオブジェクトを作成します。

    長所: #1 より手巻きが少ない。データを 1 回だけ解析します。

    短所: これは #2 ほど高速ではありません。

  3. #1 または #2 の方法を使用して、必須フィールドが存在するかどうかを判断します。そうである場合は、lift-json の逆シリアル化 (このページの「シリアル化」の見出しを探してください) を使用して作成し、反対します。

    Pro :私はここで本当にストレッチしています...データの多くが悪いと予想される場合は、lift-json デシリアライゼーションのやや重いプロセスに入る前に、それを判断することができます。

    Con : データが有効な場合に、データを 2 回解析しました。

  4. Lift-json の逆シリアル化を使用するだけです (このページの「シリアル化」の見出しを探してください)。リフレクションを使用してどのフィールドが必要かを判断することを除いて、#2 で説明されていることを多かれ少なかれ行います。

    長所:これは最もメンテナンスしやすいソリューションです

    短所: #1 と #2 より遅いです。

私の推奨事項: 可能な限り最高のパフォーマンスがどうしても必要な場合を除き、#4 を使用してください。本当にスピードが必要な場合は、#1 を使用してください。#1 または #2 スタイルのソリューションを使用するもう 1 つの利点は、JSON 内の 2 つの代替フィールド名を scala オブジェクト内の 1 つのフィールドにマッピングするなど、データに対して奇妙な強制を実行できることです。

于 2012-02-28T01:16:15.907 に答える
0

これは私にとってはうまくいきました: ScalaでのJSONからXMLへの変換とOption()結果の処理

これは、私の以前の質問からの非常に単純なカットアンドペーストです。あなたの要件に完全に一致するわけではありませんが、いくつかのアイデアが得られるかもしれません:

import util.parsing.json.JSON._

object JsonSoap {
  def main(args: Array[String]) {
    val x = parseFull("""{"name":"Joe","surname":"SOAP"}""")

    val y = x collect {
      case m: Map[_, _] => m collect {
        case (key: String, value: String) => key -> value
      }
    }

    val z = for (m <- y; name <- m.get("name"); surname <- m.get("surname"))
    yield {
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <Person>
            <Name>{name}</Name>
            <Surname>{surname}</Surname>
          </Person>
        </soap:Body>
      </soap:Envelope>
    }

    println(z)
  }
}

これらを見たことがありますか:

標準の Scala を使用して Scala で JSON を解析する

JSON の解析とオブジェクトの反復処理

単純な JSON から XML へ

于 2012-02-28T07:32:26.190 に答える
0

私たちのチームはオーダリーを検討し始めました。使用している JSON オブジェクトについては、OrderLy で十分に記述できます。私たちはそれらを使用すると思います。

あなたが言及した整然としたライブラリ: https://github.com/nparry/orderly4jvm はとても良いようです。検証が失敗した場合、まともなエラーメッセージが表示されます。

Json スキーマ、特に Java ライブラリ json-schema-validator の使用を検討しました: https://github.com/fge/json-schema-validator

エラー メッセージは説明的ではありませんでした。

于 2014-12-12T20:10:47.340 に答える
0

基本的にスキーマに対して検証しているので、オブジェクトに一致する記述子を作成し、JsonAST を使用してオブジェクトをウォークし、各レベルに適切な要素があることを検証します。バリデーターをどのように構築するかはあなた次第ですが、ast とバリデーターの両方を一緒に歩くことができるように型をミラーリングします。

于 2012-08-10T14:41:04.400 に答える
0

このjsonパーサー/バリデーターを開発しました https://github.com/HigherState/jameson

于 2013-05-18T10:33:52.090 に答える