0

The following code is working perfectly for the json has more than one elements but when it encountered single element, it is failing and throwing the following exception.

"Exception":"net.liftweb.json.MappingException: No usable value for rectype\nDid not find value which can be converted into java.lang.String"}

val list = for (source <- elements) yield
  {
    val m = source.extract[Source]
    println (" value of m " + m)
    write(Uiresult(m.key.toString(), (m.col.toString().trim()))).replace("\"$outer\":{},", "")
   }
  return (list.mkString("[\n", ",\n", "\n]"))

Element content when it is failing (List with one element)

List(JField(rectype,JString(LEAD)), JField(name,JString(MANGO KCOOPE2 KARUMBU KCOO)), JField(hashraw,JString(8674BE13EB68C5987A8F84101D8817D5)), JField(zip,JString()), JField(state,JString()), JField(listcode,JString(3395)), JField(masterid,JString(000XXX0000)), JField(vendorname,JString(ORANGE)), JField(matchtype,JString(OPA)), JField(completeRec,JString(0000XXX00002LEADORANGE3395OPAMANGO KCOOPE2 KARUMBU KCOOMANGO KCOOPE2 KARUMBU KCOOMANGO KCOOPE2 KARUMBU KCOOMANGO KCOOPE2 KARUMBU KCOOMANGO KCOOPE2 KARUMBU KCOOMANGO KCOOPE2 KARUMBU KCOO)), JField(businessId,JString()), JField(addrtype,JString()), JField(busname,JString(MANGO KCOOPE2 KARUMBU KCOO)), JField(recid,JString(000XXX0000)), JField(merge_all,JString(000XXX0000 MANGO KCOOPE2 KARUMBU KCOO MANGO KCOOPE2 KARUMBU KCOO )), JField(phone,JString()))

Element list with 2 or more is success. Below is for the list with 2 elements.

List(JField(_source,JObject(List(JField(rectype,JString(LEAD)), JField(name,JString(TREE TREE TREE)), JField(hashraw,JString(7A286CBED12A842EE44490FF9FB2EE4E)), JField(zip,JString(600028)), JField(state,JString(TN)), JField(listcode,JString(3395)), JField(masterid,JString(0XX0XXX99X)), JField(vendorname,JString(ORANGE)), JField(matchtype,JString(OPA)), JField(completeRec,JString(059785922872LEADORANGE3395OPATRI TREE DRURYTRI TREE DRURY UNIVERSITYTRI TREE DRURY UNIVERSITYTRI TREE DRURYTRI TREE DRURYTRI TREE DRURYTREE TREE TREETREE TREE TREETREE TREE TREETREE TREE TREETREE TREE TREETREE TREE TREE0YPA14951MADURAIMADURAI PARKWAYS,MADURAI PKWYPKWYSTE500MADURAITN60002814951MADURAIPKWYSTE500)), JField(businessId,JString()), JField(addrtype,JString(PA)), JField(busname,JString(TREE TREE TREE)), JField(recid,JString(5978592287)), JField(merge_all,JString(0XX0XXX99X TREE TREE TREE TREE TREE TREE 14951 MADURAI PARKWAYS STE 500 MADURAI TN 600028 )), JField(phone,JString())))), JField(_source,JObject(List(JField(rectype,JString(LEAD)), JField(name,JString(TREE TREE TREE)), JField(hashraw,JString(BA2E40AC7A212F6F77B7E5690661016B)), JField(zip,JString(600028)), JField(state,JString(TN)), JField(listcode,JString(3395)), JField(masterid,JString(0XX0XXX99X)), JField(vendorname,JString(ORANGE)), JField(matchtype,JString(OPA)), JField(completeRec,JString(059961378962LEADORANGE3395OPATRI TREE LOUISIANATRI TREE LOUISIANA STATE UNIVERSITYTRI TREE LOUISIANA STATE UNIVERSITYTRI TREE LOUISIANATRI TREE LOUISIANATRI TREE LOUISIANATREE TREE TREETREE TREE TREETREE TREE TREETREE TREE TREETREE TREE TREETREE TREE TREE0YPA14951MADURAIMADURAI PARKWAYS,MADURAI PKWYPKWYSTE500MADURAITN60002814951MADURAIPKWYSTE500)), JField(businessId,JString()), JField(addrtype,JString(PA)), JField(busname,JString(TREE TREE TREE)), JField(recid,JString(5996137896)), JField(merge_all,JString(0XX0XXX99X TREE TREE TREE TREE TREE TREE 14951 MADURAI PARKWAYS STE 500 MADURAI TN 600028 )), JField(phone,JString())))))

Work around done to handle this situation and it is working as expcted.

implicit val formats = DefaultFormats
    try {
      val json = JsonParser.parse(jsonString)

      val elements = (json \\ "_source").children
      if (elements.isEmpty == true) {
        implicit val formats = DefaultFormats
        return (List(write(ErrorMsg(searchType, "formatResult : No Matching Record Found", elements.toString())).replace("\"$outer\":{},", "")).mkString("[\n", ",\n", "\n]"))
      }

      if (size == 1 || (json.extract[ParseJson].hits.total.value == 1)) {
        val m = (json \\ "_source").extract[Source]
        val list = List(write(Uiresult(m.masterid.toString(), (m.merge_all.toString().trim()))).replace("\"$outer\":{},", ""))
        return (list.mkString("[\n", ",\n", "\n]"))
      } else {
        val list = for (source <- elements) yield {
          val m = source.extract[Source]
          write(Uiresult(m.masterid.toString(), (m.merge_all.toString().trim()))).replace("\"$outer\":{},", "")
        }
        return (list.mkString("[\n", ",\n", "\n]"))
      }
    } catch {
      case failure => return (List(write(ErrorMsg(searchType, "formatResult : Json Parsing Error", failure.toString())).replace("\"$outer\":{},", "")).mkString("[\n", ",\n", "\n]"))
    }
paul
  • 3
  • 3
  • 1
    Can you please tell us what does the `elements` contain when it succeeds, and when it fails? – Tomer Shetah Jan 07 '21 at 14:37
  • updated the details in my original request, thanks in advance for helping. – paul Jan 07 '21 at 16:55
  • as a work around I have added the code to handle when the element has one record and it is working as expected. – paul Jan 07 '21 at 19:39
  • Paul, I'm not sure if you still have a question. If your code works, please consider to post it as an answer, and not as an edit for the question, including details such as what was the issue and how it was solved. Please see [answer]. If you think that this question won't be helpful to others, consider deleting it. – Tomer Shetah Jan 09 '21 at 07:37

0 Answers0