【发布时间】:2023-03-15 20:50:02
【问题描述】:
我有以下数据结构:
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
那我该怎么做呢?
附: -- 实际上,那是https://github.com/json4s/json4s,但这并不重要,因为lift 具有相同的关于 json 提取的 API。
更新:可能需要使用转换方法。我将如何使用它?
val json = parse(jsonStr) transform {
case //.... what should be here to catch JBool -- "field3"?
}
UPDATE2:
#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
【问题讨论】:
-
json.extract[Map[String, Fields]]似乎对我有用。双Map结构没有。第二张想要捕捉的地图是什么? -
@jcern 不行,我刚查过。
-
嗯,那么提升解析器和
json4s之间似乎存在差异,因为提升版本似乎对我有用(或者我做了一些我没有意识到的额外事情)。也许它与它用于提取的格式有关。 -
@jcern “看起来”是什么意思?你在猜吗?
-
我所说的“似乎”是我不确定它是否是你想要的,因此关于做其他事情的声明(以及我关于双地图想要捕捉的问题) )。无论如何,我为您发布了 REPL 输出。它使用 Lift JSON 解析器 - 希望它有所帮助。
标签: json parsing scala lift lift-json