【问题标题】:Json string to Map in Scala --> Liftweb在 Scala 中映射的 Json 字符串 --> Liftweb
【发布时间】:2018-03-22 23:06:15
【问题描述】:

这是我的输入结构。这里的所有字段都是可选的,因为它在这个 json 字符串中可以有零个或多个元素。我可以使用 liftweb 或常规 scala。

{
"fname" :  String,
"lname" :  String,
"age" :  String,
"gender" :  String,
"phone" :  String,
"mstatus" :  String
}

输入:(注意这里“mstatus”不可用,“gender”为空)

{
"fname" : "Thomas",
"lname" : "Peter",
"age" : "20",
"gender" : "",
"phone" : "12345
}

我想读取这个 Json 字符串并检查键是否存在并且它的值不为空,然后添加到地图中。我的输出图如下所示。

val inputMap = Map(
      "fname" -> "Thomas"
      "lname" -> "Peter"
      "age" -> "20",
    "phone" -> "12345)

【问题讨论】:

    标签: scala lift-json


    【解决方案1】:

    希望对你有帮助。

    scala> val jsonString = """{
                       "fname" : "Thomas",
                       "lname" : "Peter",
                       "age" : "20",
                       "gender" : "",
                       "phone" : "12345"
                       }"""
    jsonString: String =
    {
                       "fname" : "Thomas",
                       "lname" : "Peter",
                       "age" : "20",
                       "gender" : "",
                       "phone" : "12345"
                       }
    
    scala> val r = JSON.parseFull(jsonString)
       .getOrElse(Map[String,Any]())
       .asInstanceOf[Map[String,Any]].collect{
              case e : (String, Any) if(e._2 != null && !e._2.toString.isEmpty) => e
        }
    

    输出:-

     r: scala.collection.immutable.Map[String,Any] = Map(fname -> Thomas, age -> 20, lname -> Peter, phone -> 12345)
    

    【讨论】:

    • 我在线程“main”java.lang.ClassCastException 中遇到运行时异常异常:scala.collection.immutable.HashMap$HashTrieMap 无法转换为 scala.collection.mutable.Map
    • 我仔细检查过,我无法重现这个问题。
    【解决方案2】:

    您可以使用 Spary Json lib 轻松转换和处理。

    val jsonString: String =
        """{
          |   "fname" : "Thomas",
          |   "lname" : "Peter",
          |   "age" : "20",
          |   "gender" : "",
          |   "phone" : "12345"
          |}""".stripMargin
    

    像这样解析json并获取地图键值,

    import spray.json._
    val jsonMapKeyVal: Map[String, String] =
        jsonString.parseJson
          .asJsObject
          .fields
          .map {
            case (k, JsString(v)) => k -> v
          }
          .filter(_._2!="")
    

    结果:

    Map(fname -> Thomas, age -> 20, lname -> Peter, phone -> 12345)
    

    参考:https://github.com/spray/spray-json

    【讨论】:

    • 嗨,@Rumesh Krishnan 谢谢。我已经在使用 liftweb.json 解析同一个程序中的另一个 Json 字符串。在同一个程序中使用多个 json 格式不会很好/很好。我会为 liftweb.json 欣赏类似的
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2017-02-24
    • 2020-10-09
    • 2017-03-10
    相关资源
    最近更新 更多