标签: jackson-databind

在 Jackson 的 JsonDeserializer 中获取检测到的泛型类型

由于外部原因,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)

即它以一种理智的方式提供对预期类型的​​访问。

java generics json jackson jackson-databind

10
推荐指数
1
解决办法
2335
查看次数

Kafka Json消费者错误java.lang.NoSuchFieldError:READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE

我正在使用 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 扫描对象的结构并急切地加载每种类型的反序列化器,当到达枚举类型时它会失败。有谁知道我如何跟踪和解决问题?

apache-kafka spring-kafka jackson-databind

10
推荐指数
2
解决办法
7328
查看次数

如何修复 Jackson java 8 数据/时间错误?

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。谢谢!

jackson spring-boot jackson-databind

9
推荐指数
2
解决办法
2万
查看次数

对于 Jackson,如何安全地共享 ObjectMapper ?有没有不可变的ObjectMapper?

Mapper实例是完全线程安全的,不需要创建单独使用的mapper,但mapper的配置可以更改。

虽然ObjectMapper具有复制功能,可以根据现有的映射器复制自定义配置,但如果我共享一个映射器,则不能保证当有人想要自定义映射器时,他们会复制共享的映射器。所以我想要一个不可变的映射器来共享,如果有人不小心更改了共享映射器,则应该抛出一些异常。

有这样的事吗?

java json jackson jackson-databind

8
推荐指数
1
解决办法
3084
查看次数

与杰克逊JsonProperty的龙目岛建设者模式

我使用带有构建器模式的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)

java pojo jackson lombok jackson-databind

8
推荐指数
3
解决办法
5411
查看次数

Jackson Databind ObjectMapper ConvertValue 与自定义映射实现

富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字符串是否可以自动转换为列表?

java jackson jackson-databind

8
推荐指数
1
解决办法
4万
查看次数

Jackson Databind 中是否有任何替代品来替代已弃用的属性 SerializationFeature.WRITE_NULL_MAP_VALUES ?

我们正在使用 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)

java deprecated jackson jackson-databind

7
推荐指数
1
解决办法
1万
查看次数

JsonMappingException:不是映射,不是数组,也不是枚举

我正在开发一个 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)

rest json jackson spring-boot jackson-databind

7
推荐指数
2
解决办法
1万
查看次数

更新到 Spring Boot 2 后未注册 Jackson 模块

我正在从 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 确实存在?

编辑 …

java jackson jackson-modules spring-boot jackson-databind

7
推荐指数
1
解决办法
1081
查看次数

java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/TSFBuilder

我正在使用 maven 和 dropwizard,java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/TSFBuilder当我启动对象映射器时出错。

尝试通过将com.fasterxml.jackson.core2.10.0 版添加到 POM来覆盖依赖项(也尝试了其他几个版本),但仍然出现相同的错误。

有什么建议吗?

dropwizard objectmapper jackson-databind

7
推荐指数
1
解决办法
7051
查看次数