【问题标题】:Is it possible to parse an empty sequence to an Obj?是否可以将空序列解析为 Obj?
【发布时间】:2020-12-12 02:19:43
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: scala upickle


    【解决方案1】:

    这似乎可行:

    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 应该会自动拾取它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2010-10-11
      相关资源
      最近更新 更多