0

我有一个 json 格式,它由 map -> map -> ... -> 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 的值?我完全错了吗?任何帮助深表感谢。

4

1 回答 1

1

默认情况下,像您这样的树会扩展为不同的 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)))))))
于 2014-10-06T22:33:31.647 回答