Scala Json Lift - ошибка MappingException для одной записи

У меня проблема при разборе json. Эта проблема возникает только в том случае, если есть один набор записей, все ли столбцы имеют значение или один или несколько столбцов имеют пустое значение. В других случаях работает нормально.

Мои классы для ввода приведены ниже:

    case class Source(AccountNo: String, Name: String)
    case class HitsIndex(_index: String, _type: String, _id: String, _score: Double, _source: Source)
    case class HitsCount(total: Int, max_score: Double, hits: List[HitsIndex])
    case class Shards(total: Int, successful: Int, failed: Int, hits: HitsCount)
    case class ParseJson(took: Int, timed_out: Boolean, _shards: Shards)

Операторы импорта:

import scala.collection.mutable._
import net.liftweb.json._
import net.liftweb.json.DefaultFormats
import net.liftweb.json.Serialization.write

Ниже приведен код, который я тестировал:

 case class Uiresult(AccountNo: String, Name: String)

    val json = parse(jsonString)
    val elements = (json \\ "_source").children
    for (acct <- elements) {
      val m = acct.extract[Source]
      val res = write(Uiresult(m.accountNo,  (m.firstName.toString() + m.lastName.toString()))
      println(res)
    }

Желаемый результат для одной записи:

Примечание: фамилия отображается как пустая

[
{"AccountNo":"1234","Name":"Augustin "}
]

Примечание. Все столбцы имеют значения.

[
{"AccountNo":"1234","Name":"Augustin Wagstuff "}
]

Но появляется сообщение об ошибке, как показано ниже:

 > Exception in thread "main" net.liftweb.json.MappingException: No usable value for AccountNo
    Did not find value which can be converted into java.lang.String
        at net.liftweb.json.Meta$.fail(Meta.scala:191)
        at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
        at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317)
        at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
        at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
        at scala.collection.immutable.List.map(List.scala:273)
        at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
        at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
        at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315)
        at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:366)
        at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:199)
        at net.liftweb.json.Extraction$.extract(Extraction.scala:43)
        at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:312)
        at com.aexp.prospect.atul.sample_01.JsonRead$$anonfun$1.apply(JsonRead.scala:115)
        at com.aexp.prospect.atul.sample_01.JsonRead$$anonfun$1.apply(JsonRead.scala:114)
        at scala.collection.immutable.List.map(List.scala:273)
        at com.aexp.prospect.atul.sample_01.JsonRead$.main(JsonRead.scala:114)
        at com.aexp.prospect.atul.sample_01.JsonRead.main(JsonRead.scala)
    Caused by: net.liftweb.json.MappingException: Did not find value which can be converted into java.lang.String
        at net.liftweb.json.Meta$.fail(Meta.scala:191)
        at net.liftweb.json.Extraction$.convert(Extraction.scala:403)
        at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:314)
        at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351)
        ... 16 more

Мой входной Json: (lastName пусто)

Примечание. Все столбцы имеют значения.

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 2.2488084,
    "hits": [
      {
        "_index": "test_02",
        "_type": "test_type",
        "_id": "123456",
        "_score": 2.2488084,
        "_source": {
          "AccountNo": "06009625297",
          "firstName": "Augustin",
          "lastName": "Wagstuff "
        }
      }
    ]
  }
}   

Примечание: фамилия пуста

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 2.2488084,
    "hits": [
      {
        "_index": "test_02",
        "_type": "test_type",
        "_id": "123456",
        "_score": 2.2488084,
        "_source": {
          "AccountNo": "06009625297",
          "firstName": "Augustin",
          "lastName": ""
        }
      }
    ]
  }
}   

Печать объекта Json:

Пример 1:
Здесь я заметил, что все столбцы имеют значение. Я выбрал только один набор записей, что является проблемой.

json JObject (List (JField (take, JInt (1)), JField (timed_out, JBool (false)), JField (_shards, JObject (List (JField (total, JInt (3)), JField (успешно, JInt (3) )), JField (сбой, JInt (0))))), JField (совпадения, JObject (Список (JField (всего, JInt (1))), JField (max_score, JDouble (2.2488084)), JField (совпадения, JArray ( Список (JObject (List (JField (_index, JString (test_02)), JField (_type, JString (test_type)), JField (_id, JString (123456)), JField (_score, JDouble (2.2488084)), JField (_source, JObject (Список (JField (AccountNo, JString (06009625297)), JField (firstName, JString (Augustin)), JField (lastName, JString ())))))))))))))))

Пример: 2 Здесь я заметил, что здесь lastName идет как пустое. Я выбрал только один набор записей, что является проблемой. Может ли кто-нибудь помочь мне, как справиться с этим делом.

json JObject (List (JField (take, JInt (1)), JField (timed_out, JBool (false)), JField (_shards, JObject (List (JField (total, JInt (3)), JField (успешно, JInt (3) )), JField (сбой, JInt (0))))), JField (совпадения, JObject (Список (JField (всего, JInt (1))), JField (max_score, JDouble (2.2488084)), JField (совпадения, JArray ( Список (JObject (List (JField (_index, JString (test_02)), JField (_type, JString (test_type)), JField (_id, JString (123456)), JField (_score, JDouble (2.2488084)), JField (_source, JObject (Список (JField (AccountNo, JString (06009625297)), JField (firstName, JString (Augustin)), JField (lastName, JString ())))))))))))))))

Пример с двумя или более наборами входных данных:

На входе имеется 2 набора записей (извлечено только 2 вместо 1): это не вызывает никаких проблем и дает требуемый результат. Если вы заметили, что первая запись такая же, как в предыдущем примере: 2 input, но здесь она не вызывает никаких ошибок.

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 2.2488084,
    "hits": [
      {
        "_index": "test_02",
        "_type": "test_type",
        "_id": "123456",
        "_score": 2.2488084,
        "_source": {
          "AccountNo": "06009625297",
          "firstName": "Augustin",
          "lastName": "Wagstuff"
        },
               "hits": [
      {
        "_index": "test_02",
        "_type": "test_type",
        "_id": "789078",
        "_score": 2.2188084,
        "_source": {
          "AccountNo": "06009625297",
          "firstName": "Augustin",
          "lastName": "Jhonson"
        }
      }
    ]
  }
}

Результат: Ожидается.

[
    {"AccountNo":"06009625297","Name":"Augustin Wagstuff "},
    {"AccountNo":"06009625297","Name":"Augustin Jhonson"},

    ]

значение acct из кода:

Когда я пытаюсь отобразить состязание в acct (см. Переменную в коде), когда на выходе есть один набор записей, я вижу только первый столбец, хотя все остальные столбцы на входе имеют допустимые значения.

acct JField(AccountNo,JString(1234))

Когда я пытаюсь отобразить состязание в acct (см. Переменную в коде), когда в выходных данных есть два набора записей, я вижу только первый столбец, хотя все столбцы имеют допустимые значения.

acct JField (_source, JObject (List (JField (AccountNo, JString (06009625297)), JField (firstName, JString (Augustin)), JField (lastName, JString (Wagstuff)))))

acct JField (_source, JObject (List (JField (AccountNo, JString (06009625297)), JField (firstName, JString (Augustin)), JField (lastName, JString (Jhonson)))))

Я подозреваю, что проблема возникает при повторении списка. Пожалуйста, помогите мне исправить.


person Revathi P    schedule 16.03.2018    source источник
comment
Вместо этого я переместил сюда информацию из другого вопроса. Проверьте, есть ли у меня все необходимые данные, надеюсь, вы сможете решить эту проблему.   -  person Shaido    schedule 17.03.2018
comment
Спасибо, Шайдо. Я вижу, подробности доступны по ссылке. Дэйв Уиттакер ---- ›пользователь: 829752. Может ли кто-нибудь из вас помочь мне или связать его с этим вопросом. stackoverflow.com/questions/25299474/. Также см. Другой ответ, но не могу найти решение: stackoverflow.com/questions/34170046/   -  person Revathi P    schedule 18.03.2018
comment
Я обновил более подробную информацию о своей проблеме. В частности, в каком сценарии я получаю эту проблему и также собираю данные до сбоя. Надеюсь, это поможет найти решение. Дайте мне знать, если вам понадобятся подробности.   -  person Revathi P    schedule 18.03.2018
comment
может ли кто-нибудь помочь мне в этом вопросе.   -  person Revathi P    schedule 23.03.2018


Ответы (2)


Я создал код для обработки, когда есть 1 или ноль входных записей. Работали 2 или более записи (Спасибо Шайдо). Ниже приведен код, может кто-нибудь подсказать, можно ли построить этот код лучше.

case class Source(AccountNo: fnameString, : String, lname: String)
case class HitsIndex(_index: String, _type: String, _id: String, _score: Double, _source: Source)
case class HitsCount(total: Int, max_score: Double, hits: List[HitsIndex])
case class Shards(total: Int, successful: Int, failed: Int)
case class ParseJson(took: Int, timed_out: Boolean, _shards: Shards, hits: HitsCount)

case class Uiresult(masterid: String, value: String)
case class ErrorMsg(searchType: String, error_message: String)

def formatResult(jsonString: String, searchType: String): String = {
  implicit val formats = DefaultFormats
  val json = JsonParser.parse(jsonString)

  val elements = (json \\ "_source").children
  if (elements.isEmpty == true) {
    implicit val formats = DefaultFormats
    return (List(write(ErrorMsg(searchType, "No Matching Record Found"))).mkString("[\n", ",\n", "\n]"))
  }
  if (json.extract[ParseJson].hits.total == 1) {
    val m = (json \\ "_source").extract[Source]
    val list = List(write(Uiresult(m.AccountNo.toString(), (m.fname.toString() + m.lname.toString() ))))
    return (list.mkString("[\n", ",\n", "\n]"))

  } else {
    val elements = (json \\ "_source").children
    val list = for (source <- elements) yield {
      println(" source " + source)
      val m = source.extract[Source]
      val list = List(write(Uiresult(m.AccountNo.toString(), (m.fname.toString() + m.lname.toString() ))))
    }
    return (list.mkString("[\n", ",\n", "\n]"))
  }
}
person Revathi P    schedule 25.03.2018

Аналогичное обсуждение произошло в Parse json с использованием liftweb в scala без полезного значения

Я также столкнулся с этой проблемой, когда использовал версию lift-json_2.11 как 3.2.0. После многих испытаний, наконец, я исправил эту проблему, используя версию 2.6.3.

<dependency>
    <groupId>net.liftweb</groupId>
    <artifactId>lift-json_2.11</artifactId>
    <version>2.6.3</version>
</dependency>
person Sandeep Ballu    schedule 13.10.2020
comment
Не могли бы вы добавить образец кода, который позволяет вам использовать эта зависимость? - person Tomer Shetah; 13.10.2020