当前位置: 首页 > 面试题库 >

如何使用标准Scala类在Scala中解析JSON?

钱振
2023-03-14
问题内容

我正在使用Scala 2.8中的JSON类中的构建来解析JSON代码。由于最小化依赖性,我不想使用Liftweb或其他任何一种。

我这样做的方法似乎势在必行,是否有更好的方法可以做到?

import scala.util.parsing.json._
...
val json:Option[Any] = JSON.parseFull(jsonString)
val map:Map[String,Any] = json.get.asInstanceOf[Map[String, Any]]
val languages:List[Any] = map.get("languages").get.asInstanceOf[List[Any]]
languages.foreach( langMap => {
val language:Map[String,Any] = langMap.asInstanceOf[Map[String,Any]]
val name:String = language.get("name").get.asInstanceOf[String]
val isActive:Boolean = language.get("is_active").get.asInstanceOf[Boolean]
val completeness:Double = language.get("completeness").get.asInstanceOf[Double]
}

问题答案:

这是一个基于提取器的解决方案,它将进行类转换:

class CC[T] { def unapply(a:Any):Option[T] = Some(a.asInstanceOf[T]) }

object M extends CC[Map[String, Any]]
object L extends CC[List[Any]]
object S extends CC[String]
object D extends CC[Double]
object B extends CC[Boolean]

val jsonString =
    """
      {
        "languages": [{
            "name": "English",
            "is_active": true,
            "completeness": 2.5
        }, {
            "name": "Latin",
            "is_active": false,
            "completeness": 0.9
        }]
      }
    """.stripMargin

val result = for {
    Some(M(map)) <- List(JSON.parseFull(jsonString))
    L(languages) = map("languages")
    M(language) <- languages
    S(name) = language("name")
    B(active) = language("is_active")
    D(completeness) = language("completeness")
} yield {
    (name, active, completeness)
}

assert( result == List(("English",true,2.5), ("Latin",false,0.9)))

在for循环的开始,我人为地将结果包装在一个列表中,以便在最后生成一个列表。然后在for循环的其余部分中,我将使用生成器(使用<-)和值定义(使用=)将利用unapply方法的事实。

(较旧的答案已被删除-如果您有好奇心,请查看编辑历史记录)



 类似资料:
  • 我有一个通用JSON,其中所有键和值都是字符串。 示例1: 但JSON也可以是:例如2: 我想将JSON转换为映射。示例1将转换为Map[字符串,字符串] 示例2将转换为列表[映射[字符串,字符串]] 因此,基本上我想将JSON转换为Map,并按如下方式使用它: 地图(“键1”)(“键2”)(“键3”) 获取最终结果值3。 请帮忙!!

  • 问题内容: 我一直在寻找是否有某种方法可以使用中的类,但我还没有找到任何文档或有关此主题的指南。 假设我创建了一个简单的类,其中使用的一些库,例如: 有没有可能在此类中使用此类? 太难了吗? 我必须创建一个文件吗? 有没有指导说明如何做到这一点? 顺便说一句,我也看了一下代码,感到有点迷茫,我无法出于自己的目的复制它们的功能。 问题答案: 是的,尽管不是很琐碎,但它是可能的。通常,您需要一个Jav

  • 问题内容: 我正在尝试使用字符串方法。但是,如果我将%1,%2等放置在字符串中,则会抛出java.util.UnknownFormatConversionException,指向一个令人困惑的Java源代码片段: 从中我了解到 char是被禁止的。如果是这样,那么我应该对参数占位符使用什么? 我使用Scala 2.8。 问题答案: 尽管所有先前的回答都是正确的,但它们都是Java语言。这是一个Sc

  • 问题内容: 我有以下代码: 如您所见,期望使用lambda表达式。 现在,我正在使用Java库,但是该应用程序是用Scala编写的。如何将Scala lambda传递给Java代码? 我尝试了以下方法: 但是编译器抱怨: 问题答案: 错误消息列出了支持的参数类型。其中之一是: 从错误消息中,您可以看到您提供了以下类型: 根据Kafka 1 javadoc (在Kafka 1.1中不存在),定义为:

  • 我有一个数据框,它是带有json字符串的json列。下面是一个例子。共有3列-a、b、c。c列为stringType 我想把它们变成数据帧(pivot)的列。下面的例子-

  • 问题内容: 我正在尝试使用JSON在浏览器和我的应用之间发送数据。 我正在尝试使用Lift 1.0创建和解析JSON字符串,但是由于某种原因,我无法解析刚刚构建的JSON: 如何在Scala / Lift中以编程方式构造有效的JSON消息,也可以再次对其进行解析? 问题答案: 您使用的是Lift 1.0 ,它会生成带有单引号字符串的JSON,并尝试使用仅支持双引号字符串的scala解析器进行解析。