Java 反序列化期间将POJO映射到具有不可变列表的案例类

Java 反序列化期间将POJO映射到具有不可变列表的案例类,java,scala,immutability,case-class,json4s,Java,Scala,Immutability,Case Class,Json4s,我来自Java背景,试图理解如何在Scala中建模域类/POJO 我正在尝试从RestAPI反序列化JSON响应,我的Java POJO如下所示: @Data public class ColumnResponse { private String id; private String name; private String type; ... } k 我尝试使用库进行HTTP通信,使用json4s进行反序列化 问题: 1在DataSetGetResponse

我来自Java背景,试图理解如何在Scala中建模域类/POJO

我正在尝试从RestAPI反序列化JSON响应,我的Java POJO如下所示:

@Data
public class ColumnResponse {
    private String id;
    private String name;
    private String type;
    ...
}
k

我尝试使用库进行HTTP通信,使用json4s进行反序列化

问题:

1在DataSetGetResponse案例类中,字段列是一个列表。默认情况下,这是一个不可变列表。反序列化库如何将新的DataColumnGetResponse对象添加到此不可变列表?我必须声明它是可变的吗

2在ColumnResponse POJO中有一个名为“type”字段的字段。在Scala中,“type”是一个保留关键字。如何处理这种情况?

回答第一个问题:

不可变对象可以通过复制函数进行变异:

dataSet.copy(columns = newResp :: dataSet.columns)
有关更复杂的任务,您可以使用镜头,请参见此处的示例:

回答第二个问题:

如果它是一个保留字,你可以这样做

case class ColumnResponse (id: String, name: String, `type`: String)
回答第一个问题:

不可变对象可以通过复制函数进行变异:

dataSet.copy(columns = newResp :: dataSet.columns)
有关更复杂的任务,您可以使用镜头,请参见此处的示例:

回答第二个问题:

如果它是一个保留字,你可以这样做

case class ColumnResponse (id: String, name: String, `type`: String)

这一回答涉及问题的以下方面:

反序列化库如何添加新的DataColumnGetResponse对象 这个不变的列表

让我们考虑问题的简化版本:

JsonMethods.parse("""[1,2,3]""").extract[List[Int]]
json4s如何将[1,2,3]反序列化为不可变列表[Int]?首先,它将原始字符串转换为一个抽象语法树数据结构,在该结构中它表示如下列表

case class JArray(arr: List[JValue]) extends JValue
我们在这里看到,arr是一个不可变的列表。在parse执行后构建它的关键行位于

请注意v::a.arr中的运算符如何在此列表的开头添加一个元素,并返回一个添加了v的新列表。这意味着由于[1,2,3]中有三个元素,以下三个列表是由json4s在反序列化过程中创建的

JArray(List(JInt(1))
JArray(List(JInt(2), JInt(1)))
JArray(List(JInt(3), JInt(2), JInt(1)))
再次注意,这是三个单独的列表

接下来,在创建了内部AST之后,通过调用extract[List[Int]]来实现对列表[Int]的实际转换。对列表执行此操作的关键组件是


请注意,我们如何简单地映射在解析步骤中建立的AST arr,并将每个元素转换为typeArg类型的模型,在我们的简单示例中,该类型为Int,但在您的示例中为DataColumnGetResponse。

此答案解决了问题的以下方面:

反序列化库如何添加新的DataColumnGetResponse对象 这个不变的列表

让我们考虑问题的简化版本:

JsonMethods.parse("""[1,2,3]""").extract[List[Int]]
json4s如何将[1,2,3]反序列化为不可变列表[Int]?首先,它将原始字符串转换为一个抽象语法树数据结构,在该结构中它表示如下列表

case class JArray(arr: List[JValue]) extends JValue
我们在这里看到,arr是一个不可变的列表。在parse执行后构建它的关键行位于

请注意v::a.arr中的运算符如何在此列表的开头添加一个元素,并返回一个添加了v的新列表。这意味着由于[1,2,3]中有三个元素,以下三个列表是由json4s在反序列化过程中创建的

JArray(List(JInt(1))
JArray(List(JInt(2), JInt(1)))
JArray(List(JInt(3), JInt(2), JInt(1)))
再次注意,这是三个单独的列表

接下来,在创建了内部AST之后,通过调用extract[List[Int]]来实现对列表[Int]的实际转换。对列表执行此操作的关键组件是


请注意,我们如何简单地映射在解析步骤中建立的AST arr,并将每个元素转换为typeArg类型的模型,在我们的简单示例中,该类型为Int,但在您的示例中为DataColumnGetResponse。

无需使列表可变。将元素添加到不可变列表时,将使用添加的元素创建一个新列表。关于类型字段,只需用backtics将其包围。无需使列表可变。将元素添加到不可变列表时,将使用添加的元素创建一个新列表。关于类型字段,请用backtics将其包围起来。感谢您的详细解释。这些不可变列表是否会导致不必要的空间复杂性?@ashikaumagaumagiliya我们可以用一些效率换取正确性。例如,不可变结构更有可能是线程安全的。考虑为不可变的优点和缺点探索标签。谢谢详细的解释。这些不可变的列表是否会导致不必要的空间复杂度?@ ASHIKOUMAGUMUGAGILYA,我们可以交易一些效率的正确性。例如,不可变结构更有可能是线程安全的。考虑探索标签的不变性的优点和缺点。