У меня проблема при разборе 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)))))
Я подозреваю, что проблема возникает при повторении списка. Пожалуйста, помогите мне исправить.