0

JSON 応答の情報を抽出し、ファイルが存在するかどうかを評価する必要があります。次のメソッド定義を使用しています。

override def hasField(field: Field): Boolean = {
  val schema = parse(httpClient.doGet(url + Solr5EndpointUris.schemaOverviewEndpoint)).extract[Map[String, Any]]

  val fieldsNames: List[String] = schema.get("schema") match {
    case schema: Some[Map[String, Any]] => schema.get(if (field.dynamic) "dynamicFields" else "fields") match {
      case fields: List[Map[String, Any]] => fields.map {
        case field: Map[String, Any] => field.get("name") match {
          case name: Some[String] => name.getOrElse("")
        }
      }
      case _ => throw new ApiException("Malformed Response! Missing definition for schema > fields/dynamicFields.")
    }
    case _ => throw new ApiException("Malformed Response! Could not extract schema from JSON.")
  }

  fieldsNames.contains(field.name)
}

このメソッドは、パターン マッチングを介して JSON 応答を検査し、特定の名前のフィールドが存在する場合は true を返す必要があります。JSON 応答の例は次のようになります。

{
  "responseHeader":{
  "status":0,
  "QTime":2},
  "schema":{
    "name":"example-data-driven-schema",
    "version":1.5,
    "uniqueKey":"id",
    "fieldTypes":[],
    "fields":[{
      "name":"id",
      "type":"string",
      "multiValued":false,
      "indexed":true,
      "required":true,
      "stored":true}],
    "dynamicFields":[],
    "copyFields":[]
  }
}

この実装は機能しますが、これを達成するためのより単純で複雑でない実装があると確信しています。また、次のような多くの警告が表示されます。

SchemaManager.scala:38: 型パターン Some[Map[String,Any]] の非変数型引数 Map[String,Any] は、消去によって削除されるため、チェックされていません

誰もがより良い解決策を提供できますか、および/または私が得た警告を説明できますか?

4

1 に答える 1

1
SchemaManager.scala:38: non-variable type argument Map[String,Any] in type pattern Some[Map[String,Any]] is unchecked since it is eliminated by erasure

Scalaコンパイラは、コンパイル時にジェネリック型を消去します。したがって、 を使用するpattern matchと、コンパイラはマッチ タイプ パラメータを消去します。この警告をスローします。それは型消去を呼び出します。

あなたの質問では、 JSON抽出にjson4sを使用できます。

scala> import org.json4s._
scala> import org.json4s.native.JsonMethods._
scala> val jsonStr = "{\n  \"responseHeader\":{\n  \"status\":0,\n  \"QTime\":2},\n  \"schema\":{\n    \"name\":\"example-data-driven-schema\",\n    \"version\":1.5,\n    \"uniqueKey\":\"id\",\n    \"fieldTypes\":[],\n    \"fields\":[{\n      \"name\":\"id\",\n      \"type\":\"string\",\n      \"multiValued\":false,\n      \"indexed\":true,\n      \"required\":true,\n      \"stored\":true}],\n    \"dynamicFields\":[],\n    \"copyFields\":[]\n  }\n}"
scala> implicit val formats = DefaultFormats
scala> val f = parse(jsonStr)
scala> println((f \\ "schema" \\ "fields" \\ "name").extractOrElse("Null"))
id
scala> println((f \\ "schema" \\ "fields" \\ "unknow").extractOrElse("Null"))
Null

extractOrElseデフォルト値を設定するために使用します。

于 2015-10-25T13:39:37.420 に答える