如何在没有案例类的情况下解析JSON Scala

齐射

我有一个随时间变化的JSON,用例类可能不方便,因为每次JSON更改时我都需要更改它的结构。

例如,如果我有这样的JSON:

val json= """{
  "accounts": [
  { "emailAccount": {
    "accountName": "YMail",
    "username": "USERNAME",
    "password": "PASSWORD",
    "url": "imap.yahoo.com",
    "minutesBetweenChecks": 1,
    "usersOfInterest": ["barney", "betty", "wilma"]
  }},
  { "emailAccount": {
    "accountName": "Gmail",
    "username": "USER",
    "password": "PASS",
    "url": "imap.gmail.com",
    "minutesBetweenChecks": 1,
    "usersOfInterest": ["pebbles", "bam-bam"]
  }}
  ]
}"""

我可以通过以下方式访问它吗:

val parsedJSON = parse(json)
parsedJSON.accounts(0).emailAccount.accountName
特拉维斯·布朗(Travis Brown)

circe的光学模块几乎完全支持您要求的语法:

import io.circe.optics.JsonPath.root

val accountName = root.accounts.at(0).emailAccount.accountName.as[String]

然后,如果您具有此JSON值(我正在使用circe的JSON文字支持,但您也可以使用io.circe.jawn.parseparse function)解析字符串以获取要使用的Json值):

import io.circe.Json, io.circe.literal._

val json: Json = json"""{
  "accounts": [
  { "emailAccount": {
    "accountName": "YMail",
    "username": "USERNAME",
    "password": "PASSWORD",
    "url": "imap.yahoo.com",
    "minutesBetweenChecks": 1,
    "usersOfInterest": ["barney", "betty", "wilma"]
  }},
  { "emailAccount": {
    "accountName": "Gmail",
    "username": "USER",
    "password": "PASS",
    "url": "imap.gmail.com",
    "minutesBetweenChecks": 1,
    "usersOfInterest": ["pebbles", "bam-bam"]
  }}
  ]
}"""

您可以尝试像这样访问帐户名:

scala> accountName.getOption(json)
res0: Option[String] = Some(YMail)

由于等距光学镜头是基于Monocle构建的,因此您还可以获得其他一些不错的功能,例如不可变的更新:

scala> accountName.modify(_.toLowerCase)(json)
res2: io.circe.Json =
{
  "accounts" : [
    {
      "emailAccount" : {
        "accountName" : "ymail",
        ...

等等。


更新:circe设计为模块化的,因此您只需“支付”所需的零件。上面的示例希望对SBT进行以下设置:

scalaVersion := "2.11.8"

val circeVersion = "0.4.1"

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core" % circeVersion,
  "io.circe" %% "circe-jawn" % circeVersion,
  "io.circe" %% "circe-literal" % circeVersion,
  "io.circe" %% "circe-optics" % circeVersion
)

…或对于Maven:

<dependency>
  <groupId>io.circe</groupId>
  <artifactId>circe-core_2.11</artifactId>
  <version>0.4.1</version>
</dependency>
<dependency>
  <groupId>io.circe</groupId>
  <artifactId>circe-jawn_2.11</artifactId>
  <version>0.4.1</version>
</dependency>
<dependency>
  <groupId>io.circe</groupId>
  <artifactId>circe-literal_2.11</artifactId>
  <version>0.4.1</version>
</dependency>
<dependency>
  <groupId>io.circe</groupId>
  <artifactId>circe-optics_2.11</artifactId>
  <version>0.4.1</version>
</dependency>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不修改特定类的情况下扩展具有功能的Scala类?

来自分类Dev

Scala中带有案例类的工厂设计模式

来自分类Dev

Scala中带有案例类的工厂设计模式

来自分类Dev

Scala - 如何在没有过滤器的情况下仅对列表中的某些元素进行映射?

来自分类Dev

F#等同于带有案例类/区分联合的Scala惰性val

来自分类Dev

如何在不破坏现有设置的情况下更改akka-scala响应模型

来自分类Dev

如何在 Scala 中没有早期初始化程序的情况下为超类构造函数创建参数

来自分类Dev

Scala-在没有可变类型的情况下实现循环

来自分类Dev

Scala-在没有多态的情况下实现多态抽象特征

来自分类Dev

Scala-在没有多态的情况下实现多态抽象特征

来自分类Dev

我可以使用scala-native在没有JVM的情况下运行我的scala程序吗?

来自分类Dev

在没有隐式证据对象的情况下直接使用Scala类型类

来自分类Dev

在没有隐式证据对象的情况下直接使用Scala类型类

来自分类Dev

Scala案例类翻倍

来自分类Dev

Scala案例类测试

来自分类Dev

Scala和案例类

来自分类Dev

如何在Scala中为案例类参数生成值

来自分类Dev

如何在scala案例类中转义减号

来自分类Dev

如何在Scala的班级中使用案例类对象

来自分类Dev

如何在Scala中为案例类参数生成值

来自分类Dev

如何在Play Framework 2.3.x(Scala)中将案例类转换为JSON?

来自分类Dev

如何在Scala中部分应用带有类型参数的案例类

来自分类Dev

如何在不使用scalac的情况下编译Scala代码

来自分类Dev

如何在不使用scala的情况下迭代数组?

来自分类Dev

Scala:如何在不使用 var 的情况下实现以下内容

来自分类Dev

在没有Java的情况下学习Scala

来自分类Dev

如何在没有Web请求或Web服务器的情况下解析JSON文件?

来自分类Dev

如何在没有键的情况下解析 JSON 文件?

来自分类Dev

如何在没有列表的情况下将 int json 解析为 textview

Related 相关文章

  1. 1

    如何在不修改特定类的情况下扩展具有功能的Scala类?

  2. 2

    Scala中带有案例类的工厂设计模式

  3. 3

    Scala中带有案例类的工厂设计模式

  4. 4

    Scala - 如何在没有过滤器的情况下仅对列表中的某些元素进行映射?

  5. 5

    F#等同于带有案例类/区分联合的Scala惰性val

  6. 6

    如何在不破坏现有设置的情况下更改akka-scala响应模型

  7. 7

    如何在 Scala 中没有早期初始化程序的情况下为超类构造函数创建参数

  8. 8

    Scala-在没有可变类型的情况下实现循环

  9. 9

    Scala-在没有多态的情况下实现多态抽象特征

  10. 10

    Scala-在没有多态的情况下实现多态抽象特征

  11. 11

    我可以使用scala-native在没有JVM的情况下运行我的scala程序吗?

  12. 12

    在没有隐式证据对象的情况下直接使用Scala类型类

  13. 13

    在没有隐式证据对象的情况下直接使用Scala类型类

  14. 14

    Scala案例类翻倍

  15. 15

    Scala案例类测试

  16. 16

    Scala和案例类

  17. 17

    如何在Scala中为案例类参数生成值

  18. 18

    如何在scala案例类中转义减号

  19. 19

    如何在Scala的班级中使用案例类对象

  20. 20

    如何在Scala中为案例类参数生成值

  21. 21

    如何在Play Framework 2.3.x(Scala)中将案例类转换为JSON?

  22. 22

    如何在Scala中部分应用带有类型参数的案例类

  23. 23

    如何在不使用scalac的情况下编译Scala代码

  24. 24

    如何在不使用scala的情况下迭代数组?

  25. 25

    Scala:如何在不使用 var 的情况下实现以下内容

  26. 26

    在没有Java的情况下学习Scala

  27. 27

    如何在没有Web请求或Web服务器的情况下解析JSON文件?

  28. 28

    如何在没有键的情况下解析 JSON 文件?

  29. 29

    如何在没有列表的情况下将 int json 解析为 textview

热门标签

归档