当前位置: 首页 > 知识库问答 >
问题:

JSON数组和Scala Seq

晋鹤轩
2023-03-14

我有scala类,比如A类(b:Seq[字符串])

我的问题是,当我从没有字段的文本中反序列化它时,我的类包含空字段。可以强制反序列化程序填充空的?

我使用com。fasterxml。杰克逊。数据绑定。带有com的ObjectMapper。fasterxml。杰克逊。单元斯卡拉。默认Scalamodule。

编辑:我想要的解决方案是修复所有此类字段,而不显式地提及它们的完整列表。Ir更改所有声明。

共有3个答案

翟单弓
2023-03-14

我在使用jackson反序列化String数组时遇到了类似的问题,并且发现jackson显然(尚未尝试)在jackson-mode2.1.2中修复了此问题。它可能适用于Seq。https://github.com/FasterXML/jackson-module-scala/issues/48

卢和昶
2023-03-14

如果使用Spray JSON,那么一个不处理缺少b字段的简单示例如下所示:

import spray.json._

case class A(b: Seq[String])

object Protocol extends DefaultJsonProtocol {
  implicit def aFormat = jsonFormat1(A)
}

import Protocol._

val str1 = """{ "b" : [] }""""
val str2 = """{ "b" : ["a", "b", "c"] }""""
val str3 = """{}"""
str1.parseJson.convertTo[A]//successful
str2.parseJson.convertTo[A]//successful
str3.parseJson.convertTo[A]//Deserialization error

在Spray JSON中,这可以通过为A类编写更详细的协议格式来解决:

import spray.json._

case class A(b: Seq[String])

object Protocol extends DefaultJsonProtocol {

  implicit object aFormat extends RootJsonFormat[A] {
    override def write(obj: A): JsValue = JsObject("b" -> obj.b.toJson)

    override def read(json: JsValue): A = json match {
      //Case where the object has exactly one member, 'b'
      case JsObject(map) if map.contains("b") && map.size == 1 => A(map("b").convertTo[Seq[String]])
      //Case where the object has no members
      case JsObject(map) if map.isEmpty => A(Seq())
      //Any other json value, which cannot be converted to an instance of A
      case _ => deserializationError("Malformed")
    }
  }
}

import Protocol._

val str1 = """{ "b" : [] }""""
val str2 = """{ "b" : ["a", "b", "c"] }""""
val str3 = """{}"""
str1.parseJson.convertTo[A]//successful
str2.parseJson.convertTo[A]//successful
str3.parseJson.convertTo[A]//successful

郎正平
2023-03-14

不幸的是,杰克逊目前不支持这一点。

您可以在此处查看相关的GitHub票证:https://github.com/FasterXML/jackson-databind/issues/347

您最好的选择是将null映射到类构造函数或访问器方法中的空Seq

class A(_b: Seq[String]) {
  val b = _b match {
    case null => Nil
    case bs => bs
  }
}

(另见https://stackoverflow.com/a/20655330/8261其他选项)

 类似资料:
  • 问题内容: 我有一个Ruby数组,如何在Rails 3.0中将其呈现为JSON视图? 我的控制器方法是 问题答案:

  • 问题内容: 如何在Android中以这种格式创建JSON:由于我将传递的API将解析JsonArray,然后解析该对象。还是只传递一个json对象就可以了吗?因为我只需要在每个服务调用中插入1个事务即可。 我所知道的只是JSONObject。像这个。 有任何想法吗。谢谢 问题答案: 使用以下代码:

  • 数组是值的有序集合,JSON 中的数组与 JavaScript 中的数组相似,同样需要使用方括号 定义,方括号中为数组中的若干值,值可以是 JSON 中支持的任意类型(例如字符串、数字、布尔值、对象、数组等),每个值之间使用逗号 分隔开,具体语法格式如下: [value_1, value_2, value_3, ..., value_N] 下面来看一个 JSON 数组的示例: 通过上面的示例可以看

  • 数组作为 JSON 对象[ "Google", "Runoob", "Taobao" ] JSON 数组在中括号中书写。 JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。 JavaScript 中,数组值可以是以上的 JSON 数据类型,也可以是 JavaScript 的表达式,包括函数,日期,及 undefined。 JSON 对象中的

  • 本文向大家介绍PHP实现数组转JSon和JSon转数组的方法示例,包括了PHP实现数组转JSon和JSon转数组的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现数组转JSon和JSon转数组的方法。分享给大家供大家参考,具体如下: 数组转JSon数据: 运行结果: Array (     [menber] => Array         (             [

  • JSON数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。如图 1‑5所示: 图1-5 JSON数组 JSON 数组: JSON 数组在中括号中书写。 JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数值, 对象, 数组, 布尔值或 null),也可以是 JavaScript 的表达式,包括函数、日期、undef