带有 ArrayList<String> 的 Java 对象被序列化为单个字符串,而不是包含一个字符串的数组

Posted

技术标签:

【中文标题】带有 ArrayList<String> 的 Java 对象被序列化为单个字符串,而不是包含一个字符串的数组【英文标题】:Java Object with ArrayList<String> gets SERIALIZED as a single String rather than an Array containing one String 【发布时间】:2017-07-28 21:40:52 【问题描述】:

我有一个带有以下 Java 类的 Spring Boot 应用程序

class Student
    int id;
    ArrayList<String> subjectsTaken;

我对另一个服务进行 REST 调用,其中 Student 的实例在 POST 请求中作为实体(在正文中)传递。当 subjectTaken 变量中有多个条目时,一切正常。

当subjectsTaken变量中有多个条目时,POST请求中的body如下

"id":1,"subjectsTaken":["science","mathematics","history"]

subjectTaken 是一个字符串数组

但是当subjectTaken变量只有1个条目时,请求体如下

"id":1,"subjectsTaken":"science"

其中subjectTaken 只是一个字符串(而不是一个带有一个字符串的数组)

由于这个原因,在调用的 REST 服务中反序列化失败并出现以下错误

无法将 java.util.ArrayList 的实例反序列化出 VALUE_STRING 令牌。

感谢任何关于此的指针。

【问题讨论】:

【参考方案1】:

我想我找到了解决问题的方法。您可以在发生反序列化的被调用服务的 application.properties 文件中设置此属性。

spring.jackson.deserialization.ACCEPT_SINGLE_VALUE_AS_ARRAY=true

这有助于解决问题。

【讨论】:

【参考方案2】:

我建议创建一个数组,即使它只有一个主题。并将这个数组发送到其余控制器。

"id":1,"subjectsTaken":["science"]

【讨论】:

以上是关于带有 ArrayList<String> 的 Java 对象被序列化为单个字符串,而不是包含一个字符串的数组的主要内容,如果未能解决你的问题,请参考以下文章

当Arraylist增长时,带有ArrayList键的HashMap无法找到它

带有两个数组的Java foreach循环[重复]

JHDF5 - 如何避免数据集被覆盖

为啥我不能有两个带有 ArrayList 参数的方法?

如何从 ArrayList<Hashtable<String, ArrayList<String>>> 获取值

我有一个要转换为 ArrayList<String> 的 ArrayList<JCheckBox>