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

Scala / Play:将JSON解析为Map而不是JsObject

宗政松
2023-03-14
问题内容

他们在Play Framework的首页上声称“ JSON是头等公民”。我还没有看到证明。

在我的项目中,我正在处理一些非常复杂的JSON结构。这只是一个非常简单的示例:

{
    "key1": {
        "subkey1": {
            "k1": "value1"
            "k2": [
                "val1",
                "val2"
                "val3"
            ]
        }
    }
    "key2": [
        {
            "j1": "v1",
            "j2": "v2"
        },
        {
            "j1": "x1",
            "j2": "x2"
        }
    ]
}

现在,我知道Play正在使用Jackson解析JSON。我在Java项目中使用Jackson,并且会做如下简单的事情:

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> obj = mapper.readValue(jsonString, Map.class);

这将很好地将我的JSON解析为我想要的Map对象-字符串和对象对Map,并允许我轻松地将数组转换为ArrayList

Scala / Play中的相同示例如下所示:

val obj: JsValue = Json.parse(jsonString)

相反,这给了我一个专有JsObject
类型,这并不是我真正想要的。

我的问题是:我可以解析Scala / Play中的JSON字符串,MapJsObject不像我在Java中那样轻松地解析它吗?

附带问题:是否有理由在Scala / Play中JsObject代替使用Map

我的堆栈:Play Framework 2.2.1 / Scala 2.10.3 / Java 8 64bit / Ubuntu 13.10 64bit

更新:
我可以看到特拉维斯的答案被否决了,所以我认为这对每个人都有意义,但是我仍然看不到如何将其应用于解决我的问题。假设我们有这个示例(jsonString):

[
    {
        "key1": "v1",
        "key2": "v2"
    },
    {
        "key1": "x1",
        "key2": "x2"
    }
]

好吧,根据所有指示,我现在应该放入所有否则不了解其目的的样板:

case class MyJson(key1: String, key2: String)
implicit val MyJsonReads = Json.reads[MyJson]
val result = Json.parse(jsonString).as[List[MyJson]]

看起来不错,是吗?但是等一下,数组中又出现了另一个元素,这完全破坏了这种方法:

[
    {
        "key1": "v1",
        "key2": "v2"
    },
    {
        "key1": "x1",
        "key2": "x2"
    },
    {
        "key1": "y1",
        "key2": {
            "subkey1": "subval1",
            "subkey2": "subval2"
        }
    }
]

第三个元素不再与我定义的案例类匹配-
我再次处于平方。我每天都能在Java中使用这样复杂得多的JSON结构,Scala是否建议我简化JSON以适应其“类型安全”策略?如果我错了,请纠正我,但是我虽然应该用这种语言来提供数据,而不是相反?

UPDATE2: 解决方法是将Jackson模块用于scala(我的答案中的示例)。


问题答案:

我选择将Jackson模块用于scala。

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val obj = mapper.readValue[Map[String, Object]](jsonString)


 类似资料:
  • 我得到了一个配置好的jackson的ObjectMapper实例,其中应用了一些模块、反序列化器和配置。 我还有一个“平面”json,这意味着要么没有内部节点,要么ObjectMapper能够将内部节点解析为单个对象。 我想将给定的json解析为映射 这就像用解析pojo,然后使用反射收集pojo字段。但是我想避免提取pojo的类,避免使用反射并获取结果Map只存在于json属性中。

  • 考虑到类有三个字段name(String)、age(int)、salary(double)。 我想创建一个名为键,值为工资的映射(而不是对象本身),如果键不唯一,则使用linkedList保存所有重复键的值。 如何实现这种场景?

  • 问题内容: 我正在尝试在2.1RC Play框架中将Scala转换为JSON。 我可以执行以下操作并获取JSON: 因为a1只是可以正常工作的Map [String,String]。 但是,如果我有一些更复杂的东西,例如Map [String,Object],那是行不通的: 我发现我可以执行以下操作: 那行得通。 但是,我该如何一般地做到这一点?我以为可以做以下事情: 但是我仍然收到一个无法反序列

  • 问题内容: 我在MongoDB中的规范化数据模型结构中遇到以下错误: 这是由于以下原因造成的: 具体的部分。我的文档中有一个DBRef对象,因此我可以引用另一个集合中的文档。嵌入式文档结构不是选项。那么我该如何解决呢? 问题答案: 您必须为其导入DBRef编解码器才能进行打印,如果您希望以文档json样式进行打印,则需要编写自己的DBRef编解码器,并将其添加到您给toJson()的编解码器中。

  • 问题内容: 我有一个XML文件,例如 如何将其解析为JSON结构文件? 问题答案: 对于一个简单的解决方案,我建议使用Jackson库,它是一个Java库,用于生成和读取带有XML扩展名的JSON,因为它只需几行简单的代码就可以将任意复杂的XML转换为JSON。 input.xml Java代码: 该演示使用Jackson 1.7.7 (较新的1.7.8也可以使用),Jackson XML Dat

  • 问题内容: 首先让我解释一下这个问题。 我的Golang应用程序中包含了JSON记录流。它基本上将这些转发到数据存储(InfluxDB)。JSON中有一些整数值,还有一些浮点值。必须将它们与原始数据类型一起转发到数据存储。否则,将发生类型冲突,并且写入操作将失败。 Ruby JSON解析器可以轻松做到这一点: Golang中的软件包确实有一些麻烦(所有数字都解析为浮点数): 哪些打印: 我需要一种