1

我正在使用 Scala 的 uPickle 来解析这个 JSON:

{ "somevalue": 1, "revenue": [], "boost": { ... } }

问题是“收入”有时是一个对象,有时是一个数组。如果它是一个空数组,这意味着该值不存在(它应该为null或不存在,但我没有生成这个json,所以我必须适应)。

是否有可能说服 uPickle 以便当它期望 aMap[_,_]并获得一个空序列时,发出一个空对象?我想像这样为上面的 json 声明一个案例类:

case class MyObject {
    val somevalue: Int,
    val revenue: Map[String, RevenueChildItem],
    val boost: Map[String, BoostChildItem],
}

目前 uPickle 将中止错误“期望对象,得到序列”。

我也许可以在解析之前对 JSON 文件进行预处理,但首先我想知道 uPickle 是否能够做这样的事情?

我知道我可能可以使用自定义pickler来做到这一点,但是我有几十个结构要解析,每个结构都有相同的规则(即空对象的空序列),这样做真的很好它以更一般的方式,并自动在任何地方应用它。

4

1 回答 1

0

似乎这会起作用:

implicit def emptyArrToEmptyDict[T: Reader]: Reader[Map[String, T]] = {
  reader[ujson.Value].map[Map[String, T]] {
    case ujson.Arr(array) if array.length == 0 => Map()
    case other => other.obj.map { case (k, v) => (k -> v.transform(implicitly[Reader[T]])) }.toMap
  }
}

emptyArrToEmptyDict如果你把它放在某个对象中并将名称导入全局命名空间,uPickle 应该会自动拾取它。

于 2020-08-23T08:40:36.510 回答