我有以下数据结构:
val jsonStr = """
{
"data1": {
"field1": "data1",
"field2": 1.0,
"field3": true
},
"data211": {
"field1": "data211",
"field2": 4343.0,
"field3": false
},
"data344": {
"field1": "data344",
"field2": 436778.51,
"field3": true
},
"data41": {
"field1": "data41",
"field2": 14348.0,
"field3": true
}
}
"""
我想把它取出来。以下是我在没有任何运气的情况下正在做的事情:
#1.
case class Fields(field1: String, field2: Double, field3: Boolean)
json.extract[Map[String, Map[Fields, String]]]
//org.json4s.package$MappingException: Do not know how to convert JBool(true)
//into class java.lang.String
#2.
json.extract[Map[String, Map[String, Fields]]
//java.lang.InternalError: Malformed class name
#3.
json.extract[Map[String, Map[String, Any]]]
//org.json4s.package$MappingException: No information known about type
#4.
json.extract[Map[String, Map[String, String]]]
//org.json4s.package$MappingException: Do not know
//how to convert JBool(true) into class java.lang.String
那我该怎么做?
P、 实际上,那是https://github.com/json4s/json4s但这并不重要,因为lift在json提取方面有相同的API。
更新:可能需要使用转换方法。我将如何使用它?
val json = parse(jsonStr) transform {
case //.... what should be here to catch JBool -- "field3"?
}
更新2:
#5
json.extract[Map[String, Map[String, JValue]]]
// Works! but it's not what I'm looking for, I need to use a pure Java/Scala type
scala> val jsonStr = """
| {
| "data1": {
| "field1": "data1",
| "field2": 1.0,
| "field3": true
| },
| "data211": {
| "field1": "data211",
| "field2": 4343.0,
| "field3": false
| },
| "data344": {
| "field1": "data344",
| "field2": 436778.51,
| "field3": true
| },
| "data41": {
| "field1": "data41",
| "field2": 14348.0,
| "field3": true
| }
| }
| """
jsonStr: java.lang.String =
"
{
"data1": {
"field1": "data1",
"field2": 1.0,
"field3": true
},
"data211": {
"field1": "data211",
"field2": 4343.0,
"field3": false
},
"data344": {
"field1": "data344",
"field2": 436778.51,
"field3": true
},
"data41": {
"field1": "data41",
"field2": 14348.0,
"field3": true
}
}
"
scala> import net.liftweb.json._
import net.liftweb.json._
scala> implicit val formats = DefaultFormats
formats: net.liftweb.json.DefaultFormats.type = net.liftweb.json.DefaultFormats$@361ee3df
scala> val json = parse(jsonStr)
json: net.liftweb.json.package.JValue = JObject(List(JField(data1,JObject(List(JField(field1,JString(data1)), JField(field2,JDouble(1.0)), JField(field3,JBool(true))))), JField(data211,JObject(List(JField(field1,JString(data211)), JField(field2,JDouble(4343.0)), JField(field3,JBool(false))))), JField(data344,JObject(List(JField(field1,JString(data344)), JField(field2,JDouble(436778.51)), JField(field3,JBool(true))))), JField(data41,JObject(List(JField(field1,JString(data41)), JField(field2,JDouble(14348.0)), JField(field3,JBool(true)))))))
scala> case class Fields(field1: String, field2: Double, field3: Boolean)
defined class Fields
scala> json.extract[Map[String, Fields]]
res1: Map[String,Fields] = Map(data1 -> Fields(data1,1.0,true), data211 -> Fields(data211,4343.0,false), data344 -> Fields(data344,436778.51,true), data41 -> Fields(data41,14348.0,true))
主要内容:实例,提取器使用模式匹配,实例提取器是从传递给它的对象中提取出构造该对象的参数。 Scala 标准库包含了一些预定义的提取器,我们会大致的了解一下它们。 Scala 提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。 以下实例演示了邮件地址的提取器对象: 实例 object Test { def m
提取器是从传递给它的对象中提取出构造该对象的参数。 Scala 标准库包含了一些预定义的提取器,我们会大致的了解一下它们。 Scala 提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。 以下实例演示了邮件地址的提取器对象: object Test { def main
我想从Kafka中提取CN。如何用Java从X509Certificate中提取CN?帮助我解决了这个问题,但问题是从X509certificate中提取CN,我花了很多时间来为我自己的问题找到正确的解决方案。我想我的解决方案可以帮助某人更快地得到正确的答案。
我正在为函数表达式编写提取器对象。下面是它的样子: 我可以摘录如下: 但这并不像它可能的那样可爱。我想有这样的东西: 就像咖喱榨汁机。所以我尝试了这个: 但它没有工作: 有办法在Scala中做到这一点吗?
我在Hadoop / Spark框架的顶部使用Scala。 实际上我的数据是这种类型的: 并且,这是此数据记录中前两行的示例: 在实际情况下,每行有194列,我总共有160多万条记录。 有了这个数据集,我想填充一个新的列表,类型为: 其中,第一个“Int”是每行的每个字段(COD_LOCALE_PROGETTO、CUP…),第二个字段是每个字段的大小(19、3、…);第三个字段是已经编码在变量中的