【问题标题】:Extracting json in Scala在Scala中提取json
【发布时间】: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


【解决方案1】:
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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2014-10-04
    相关资源
    最近更新 更多