他们在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字符串,Map
而JsObject
不像我在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中的软件包确实有一些麻烦(所有数字都解析为浮点数): 哪些打印: 我需要一种