由于外部原因,Map
我系统中的所有 java只能作为来自客户端的键值对列表接收,例如 aMap<String, Book>
实际上将作为 Json-serialized 接收List<MapEntry<String, Book>>
。这意味着我需要自定义我的 Json 反序列化过程以期望这种地图表示。
问题是JsonDeserializer
让我实施
deserialize(JsonParser p, DeserializationContext ctxt)
Run Code Online (Sandbox Code Playgroud)
无法访问检测到的应该反序列化的泛型类型的方法(Map<String, Book>
在上面的示例中)。如果没有这些信息,我将无法在List<MapEntry<String, Book>>
不失去类型安全性的情况下反序列化。
我正在查看Converter但它提供的上下文更少。
例如
public Map<K,V> convert(List<MapToListTypeAdapter.MapEntry<K,V>> list) {
Map<K,V> x = new HashMap<>();
list.forEach(entry -> x.put(entry.getKey(), entry.getValue()));
return x;
}
Run Code Online (Sandbox Code Playgroud)
但这可能会创建危险的映射,ClassCastException
在检索时会抛出异常,因为无法检查类型是否实际合理。有没有办法解决这个问题?
作为我期望的一个例子,GsonJsonDeserializer
看起来像这样:
T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
Run Code Online (Sandbox Code Playgroud)
即它以一种理智的方式提供对预期类型的访问。
我正在使用 Spring Boot 和 Json Deserializer 来运行 kafka Consumer。运行应用程序时我收到错误
Caused by: java.lang.NoSuchFieldError: READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE
at com.fasterxml.jackson.databind.deser.std.EnumDeserializer.createContextual(EnumDeserializer.java:211)
at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:836)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:550)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:294)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:644)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:539)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:294)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:644)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:539)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:294)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:654)
at com.fasterxml.jackson.databind.ObjectReader._prefetchRootDeserializer(ObjectReader.java:2430)
at com.fasterxml.jackson.databind.ObjectReader.<init>(ObjectReader.java:194)
at com.fasterxml.jackson.databind.ObjectMapper._newReader(ObjectMapper.java:780)
at com.fasterxml.jackson.databind.ObjectMapper.readerFor(ObjectMapper.java:4263)
at org.springframework.kafka.support.serializer.JsonDeserializer.initialize(JsonDeserializer.java:502)
at org.springframework.kafka.support.serializer.JsonDeserializer.setupTarget(JsonDeserializer.java:487)
... 56 common frames omitted
Run Code Online (Sandbox Code Playgroud)
我正在使用 spring-boot 3.0.5 和 jackson-databing 2.15.0。有人遇到过同样的错误吗?
我试图调试这个问题,它似乎与我的域对象包含枚举类型作为属性这一事实有关。Jackson 扫描对象的结构并急切地加载每种类型的反序列化器,当到达枚举类型时它会失败。有谁知道我如何跟踪和解决问题?
Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
Run Code Online (Sandbox Code Playgroud)
我在使用 gradle 的 spring boot 项目中遇到了这个错误。我也添加了下面给出的 jsr310 的 gradle 依赖项,但它仍然不起作用。
implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.13.3'
Run Code Online (Sandbox Code Playgroud)
我该如何修复这个错误?我的项目使用java 17和spring 2.6.7。谢谢!
Mapper实例是完全线程安全的,不需要创建单独使用的mapper,但mapper的配置可以更改。
虽然ObjectMapper具有复制功能,可以根据现有的映射器复制自定义配置,但如果我共享一个映射器,则不能保证当有人想要自定义映射器时,他们会复制共享的映射器。所以我想要一个不可变的映射器来共享,如果有人不小心更改了共享映射器,则应该抛出一些异常。
有这样的事吗?
我使用带有构建器模式的lombok构造了一个Java对象。但是,当尝试使用Jackson来反序列化Java对象时,出现以下异常。对于具有@JsonProperty
注释的字段,会发生这种情况。
线程“ main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“ user_name”(类User $ UserBuilder),未标记为
位于[[来源:(String)“ {” userId“:1,” user_name“:” username“}”; 行:1,列:26](通过参考链:User $ UserBuilder [“ user_name”])
使用的代码:
public class TestJson {
public static void main(String args[]) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
User user = User.builder()
.userName("username")
.userId(1)
.build();
System.out.println(user);
String string = objectMapper.writeValueAsString(user);
System.out.println(string);
user = objectMapper.readValue(string, User.class);
System.out.println(user);
}
}
@JsonDeserialize(builder = User.UserBuilder.class)
@Getter
@ToString
@Builder(toBuilder = true)
class User {
@JsonProperty("user_name")
@NonNull
private String userName;
@JsonProperty
private int userId;
@JsonPOJOBuilder(withPrefix = "")
public …
Run Code Online (Sandbox Code Playgroud) 富1
public class Foo1{
private Long id;
private String code;
private String name;
private Boolean rState;
private String comments; // Contain json data
private String attachments; // Contain json data
}
Run Code Online (Sandbox Code Playgroud)
富2
public class Foo2{
private Long id;
private String code;
private String name;
private Boolean rState;
private List comments;
private List attachments;
}
Run Code Online (Sandbox Code Playgroud)
转换值
new ObjectMapper().convertValue(foo1, Foo2.class);
Run Code Online (Sandbox Code Playgroud)
当我调用转换值时,json字符串是否可以自动转换为列表?
我们正在使用 ObjectMapper 来忽略项目中空映射的序列化
configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false)
Run Code Online (Sandbox Code Playgroud)
但在 Jackson-Databind 2.9 之后,该属性已贬值,我们正在寻找替代选项。
下面的代码可以替代删除上述属性吗 -
setSerializationInclusion(Include.NON_NULL)
Run Code Online (Sandbox Code Playgroud) 我正在开发一个 REST API 应用程序,但我的代码有一些问题。我想返回一个扩展 avro 架构并将 HATEOAS 链接添加到响应的对象。我做了一些调查,结果发现我需要对象的自定义序列化器。
有问题的部分代码是:
@JsonValue
public String serialize() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(this);
}
Run Code Online (Sandbox Code Playgroud)
这返回
无法写入 JSON:不是枚举。
当前对象是 avro 模式的扩展。我也尝试过:
@JsonValue
public String serialize() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(getUserData());
}
Run Code Online (Sandbox Code Playgroud)
它返回:
无法写入 JSON:不是数组
其中用户数据是实际的 avro 对象。我不明白这些错误是什么意思。有人可以解释一下吗?另外,是否有更好的方法来结合其他参数返回 avro 对象?
谢谢
编辑:
这是完整的示例:
public class PaginatedUserData extends UserDataAvro {
@JsonValue
public String serialize() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
HashMap<String, String> map = new HashMap<>(); …
Run Code Online (Sandbox Code Playgroud) 我正在从 Spring Boot 1.5.21 升级到 2.2.5。
我需要用来MonetaryModule
反序列化休息调用,并取决于 Spring 的ObjectMapper
.
我在某个@Configuration
类(MonetaryModule
正在扩展Module
)中为此模块定义了这样一个 bean :
@Bean
public MonetaryModule monetaryModule() {
return new MonetaryModule();
}
Run Code Online (Sandbox Code Playgroud)
我可以在/beans
端点中看到它已创建。但是,它实际上并未加载到ObjectMapper
. 在对 Spring 的代码进行了大量调试和挖掘之后,我得出的结论是JacksonAutoConfiguration
. 它有一个名为的内部静态类JacksonObjectMapperBuilderConfiguration
,其中有一个bean
创建Jackson2ObjectMapperBuilder
. 在创建过程中,有一个调用customize()
最终会得到这个代码:
private void configureModules(Jackson2ObjectMapperBuilder builder) {
Collection<Module> moduleBeans = getBeans(this.applicationContext, Module.class);
builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
}
Run Code Online (Sandbox Code Playgroud)
这段代码似乎负责将模块加载到 中ObjectMapper
,问题是这Jackson2ObjectMapperBuilder
实际上并没有被创建。它出现在/beans
端点中,但事实上当我在那里断点时我没有到达断点。这解释了为什么模块没有加载到ObjectMapper
.
问题是,为什么没有调用这段代码?为什么/bean
表明 bean 确实存在?
编辑 …
我正在使用 maven 和 dropwizard,java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/TSFBuilder
当我启动对象映射器时出错。
尝试通过将com.fasterxml.jackson.core
2.10.0 版添加到 POM来覆盖依赖项(也尝试了其他几个版本),但仍然出现相同的错误。
有什么建议吗?
jackson-databind ×10
jackson ×8
java ×6
json ×3
spring-boot ×3
apache-kafka ×1
deprecated ×1
dropwizard ×1
generics ×1
lombok ×1
objectmapper ×1
pojo ×1
rest ×1
spring-kafka ×1