使用json4s在scala中提取递归数据结构时遇到问题

使用json4s在scala中提取递归数据结构时遇到问题,json,scala,json4s,Json,Scala,Json4s,我有一个json格式,由map->map->…->int表示每个键的任意映射数。键始终是字符串,叶类型始终是int。贴图结构的深度因贴图中的每个关键点而异。例如,键“A”可以是类型Map[String,Int],键“B”可以是类型Map[String,Map[String,Int]]。我知道我可以成功地将这种格式解析为Map[String,Any],但我正试图保留这些类型,以便以后在代码中更容易合并这些结构 我似乎无法以这样的方式定义我的嵌套结构,即不在json4s提取中抛出错误。我不太确定问题

我有一个json格式,由map->map->…->int表示每个键的任意映射数。键始终是字符串,叶类型始终是int。贴图结构的深度因贴图中的每个关键点而异。例如,键“A”可以是类型Map[String,Int],键“B”可以是类型Map[String,Map[String,Int]]。我知道我可以成功地将这种格式解析为Map[String,Any],但我正试图保留这些类型,以便以后在代码中更容易合并这些结构

我似乎无法以这样的方式定义我的嵌套结构,即不在json4s提取中抛出错误。我不太确定问题是在我的结构定义中,还是我没有正确地进行json提取

这是密码

sealed trait NestedMap[A]
case class Elem[A](val e : A) extends NestedMap[A]
case class NMap[A](val e : Map[String, NestedMap[A]]) extends NestedMap[A]
// XXX this next line doesn't seem to help or hurt
case class Empty extends NestedMap[Nothing]

implicit val formats = DefaultFormats
val s = "{\"1\": 1, \"2\": 1, \"3\": {\"4\": 1}}"

val b = parse(s).extract[NMap[Int]] 
这是经常出现的错误

org.json4s.package$MappingException: No usable value for e
Expected object but got JNothing

是否需要添加另一个扩展NestedMap的值?我是不是完全错了?非常感谢您的帮助。

默认情况下,像您这样的树会扩展为不同的json

import org.json4s._
import org.json4s.native.Serialization
import org.json4s.native.Serialization.{read, write}
import org.json4s.native.JsonMethods._

implicit val formats = Serialization.formats(NoTypeHints)

sealed trait Elem
case class Leaf(val e:Int) extends Elem
case class Tree(val e:Map[String, Elem]) extends Elem

scala> val t = Tree(Map("1"->Leaf(1),"2"->Leaf(2),"3"->Tree(Map("4"->Leaf(4)))))
t: Tree = Tree(Map(1 -> Leaf(1), 2 -> Leaf(2), 3 -> Tree(Map(4 -> Leaf(4)))))
scala> write(t)
res0: String = {"e":{"1":{"e":1},"2":{"e":2},"3":{"e":{"4":{"e":4}}}}}
scala> val jt = parse(res0)
jt: org.json4s.JValue = JObject(List((e,JObject(List((1,JObject(List((e,JInt(1))))), (2,JObject(List((e,JInt(2))))), (3,JObject(List((e,JObject(List((4,JObject(List((e,JInt(4))))))))))))))))


scala> val s = """{"1":1,"2":2, "3":{"4":1}}"""
s: String = {"1":1,"2":2, "3":{"4":1}}
scala> val st = parse(s)
st: org.json4s.JValue = JObject(List((1,JInt(1)), (2,JInt(2)) (3,JObject(List((4,JInt(1)))))))

我现在明白为什么我的特质是错误的,因为它找不到“e”。谢谢但是,我仍然不知道如何定义s的类型。我没有生成这个json,所以我不能修改它以包含“e”。