2015-10-25 3 views
0

Мне нужно извлечь информацию о реакции JSON и оценить, присутствует ли какой-либо файл или нет. Я использую следующее определение метода:Scala erasure in pattern matching

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 с помощью сопоставления с образцом и должен возвращать верно, если поле с определенным именем присутствует. Пример 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: без переменной аргумент типа Map [String, любая] в типе шаблона Некоторые [Карта [String, любой]] снят, так как она удаляется по стиранию

Может ли кто-нибудь предоставить лучшее решение и/или объяснить предупреждения, которые я получаю?

ответ

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 

Скала компилятор стирает универсального типа во время компиляции. поэтому, когда вы используете pattern match, компилятор будет стирать ваш тип типа соответствия. и бросить это предупреждение. он вызывает тип erasure.

Для вашего вопроса, вы можете использовать json4s для JSON экстракта:

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 для установки значения по умолчанию.