我有这样一个实体:
public class User {
private Long id;
private String email;
private String password;
private List<Role> roles;
//set of constructors, getters, setters...
和相关的JSON:
[
{
"email": "user@email",
"roles": ["REGISTERED_USER"]
}
]
我试图在Spring MVC@Controller中以如下方式对其进行反序列化:
List<User> users = Arrays.asList(objectMapper.readValue(multipartFile.getBytes(), User[].class));
添加列表之前
如果您有权访问角色类,则只需添加以下构造函数:
private Role(String role) {
this.role = role;
}
或静态工厂方法:
@JsonCreator
public static Role fromJson(String value){
Role role = new Role();
role.setRole(value);
return role;
}
@JsonValue
public String toJson() {
return role;
}
否则,您必须编写自定义反序列化程序并在对象映射器上注册它,如下所示:
public static class RoleSerializer extends JsonSerializer {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
gen.writeString(((Role) value).getRole());
}
}
public static class RoleDeserializer extends JsonDeserializer {
@Override
public Role deserialize(JsonParser jsonParser,DeserializationContext deserializationContext) throws IOException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
Role role = new Role();
role.setRole(node.asText());
return role;
}
}
以下是演示:https://gist.github.com/varren/84ce830d07932b6a9c18
from:[{"email":"user@email","角色":["REGISTERED_USER"]}]
致OBJ:[用户{id=null,电子邮件=]user@email“,password='null',roles=Role{Role='REGISTERED_USER'}]
致JSON:[{"email":"user@email","角色":["REGISTERED_USER"]}]
Ps:如果您像这样使用ObjectMapper
Arrays.asList(objectMapper.readValue(multipartFile.getBytes(), User[].class));
然后,演示中的代码将起作用,但您可能必须在Spring中为jackson ObjectMapper设置自定义Bean,以使RoleDeserializer和RoleSerializer在任何地方都能工作。以下是更多信息:Spring,Jackson和定制(例如:定制工具
我有一个抽象的超类A,我有几个具体的子类B,C,D 在序列化方面,我执行以下操作: 没问题。我现在想反序列化这个。我知道我不能实例化一个抽象类,那么这是如何实现的呢? 这不起作用: 编辑:我把这个添加到我的抽象超类中:(仍然没有运气) 再次编辑:我现在遇到以下错误: 看看JSON,@class不在那里。我怎样才能做到?我试过: 但这并没有奏效。有这方面的例子吗?如何告诉对象映射器对类使用我的注释?
问题内容: 使用Spring Boot和Jackson,如何将包装/内部列表反序列化为直接在外部级别的列表? 例如,我有: 在JSON中,是; 下的列表。但我想将其解析为直接位于下方的名为列表的列表,而不是定义包含名为的列表的DTO 。 这可能吗?如何定义此DTO ? 问题答案: 看来这就是我所需要的。 https://www.baeldung.com/jackson- annotations @
我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。
问题内容: 我需要从redis保存和加载对象。 该对象包含GrantedAuthority列表(除其他外),它是一个接口: Jackson成功地序列化了该对象,但是未能反序列化该对象,但有以下例外: 我知道可以通过添加以下内容来指定类型: 但是在这种情况下我无法做到这一点,因为the 是Spring的接口,我无法更改它。 序列化的json是: } 摘要只能用填充。 所以我尝试了: 仍然没有运气。
问题内容: 我需要从Redis保存和加载对象。 该对象包含GrantedAuthority列表(除其他外),它是一个接口: Jackson成功地序列化了该对象,但未能反序列化,但有以下例外: 我知道我可以通过添加以下内容来指定类型: 但是在这种情况下我无法做到这一点,因为the 是Spring的接口,我无法更改它。 序列化的json是: } 摘要只能用填充。 所以我尝试了: 仍然没有运气。 问题答
我需要从 redis 保存和加载对象。 该对象包含GrantedAuthority列表(以及其他内容),它是一个接口: Jackson 成功序列化了该对象,但未能对其进行反序列化,但有以下异常: 我知道我可以通过添加来指定类型: 但在这种情况下我不能这样做,因为是Spring的一个接口,我不能更改它。 序列化的json是: } 摘要只充满了。 所以我尝试了: 但仍然没有运气。