标签: jackson2

Jackson中的ObjectNode和JsonNode有什么区别?

根据以下文件JsonNode:

但是,大多数mutator需要通过特定的子类(例如ObjectNode 和ArrayNode)进行访问.

但是我仍然感到困惑,因为一些stackoverflow答案似乎可以互换使用它们.他们有什么不同的目的?

java json jackson jackson2

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

如何在Spring Boot Jackson Date序列化中应用默认时区

我已将Spring Boot应用程序配置为将日期序列化为ISO8601字符串:

spring:
  jackson:
    serialization:
      write-dates-as-timestamps: false
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

"someDate": "2017-09-11T07:53:27.000+0000"
Run Code Online (Sandbox Code Playgroud)

不过我的时区是欧洲/马德里.事实上,如果我打印TimeZone.getDefault()这是我得到的.

如何让杰克逊使用实际时区序列化这些日期时间值?GMT + 2

"someDate": "2017-09-11T09:53:27.000+0200"
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc jackson spring-boot jackson2

17
推荐指数
4
解决办法
3万
查看次数

杰克逊,用私有字段反序列化类和没有注释的arg构造函数

可以使用私有字段和自定义参数构造函数反序列化为不使用注释而不使用Jackson修改类的类?

我知道在使用这种组合时杰克逊有可能:1)Java 8,2)用"-parameters"选项编译,3)参数名称与JSON匹配.但是在没有所有这些限制的情况下,默认情况下也可以在GSON中使用.

例如:

public class Person {
    private final String firstName;
    private final String lastName;
    private final int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public static void main(String[] args) throws IOException {
        String json = "{firstName: \"Foo\", lastName: \"Bar\", age: 30}";

        System.out.println("GSON: " + deserializeGson(json)); // works fine
        System.out.println("Jackson: " + deserializeJackson(json)); // error
    }

    public static Person deserializeJackson(String json) throws IOException {
        ObjectMapper mapper = …
Run Code Online (Sandbox Code Playgroud)

java json jackson jackson2 jackson-databind

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

PageImpl 反序列化期间出错:无法构造“org.springframework.data.domain.PageImpl”的实例

问题是当将 Spring 缓存与 Redis 缓存管理器一起使用时,由于没有默认构造函数,无法反序列化 Spring Pageable 响应

使用的spring boot版本是2.1.4.RELEASE

使用序列化器的 Redis 配置类

@Bean
public RedisCacheManager redisCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues()
        .serializeValuesWith(
            RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));

    redisCacheConfiguration.usePrefix();

    return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory)
            .cacheDefaults(redisCacheConfiguration).build();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 Spring 缓存和 Redis 作为缓存后端在 Redis 缓存中缓存 Spring REST API 页面结果响应

@GetMapping
@Cacheable("Article_Response_Page")
public Page<Article> findAll(Pageable pageable) {
    return articleRepository.findAll(pageable);
}
Run Code Online (Sandbox Code Playgroud)

我可以Page<Article>使用序列化程序在 Redis 缓存中看到以 JSON 形式缓存,RedisSerializer.json()但在下一次调用期间,当从缓存中读取数据时,出现以下异常

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot 
construct instance of `org.springframework.data.domain.PageImpl` (no 
Creators, like default construct, exist): cannot deserialize from Object 
value (no delegate- or …
Run Code Online (Sandbox Code Playgroud)

fasterxml spring-boot spring-cache spring-data-commons jackson2

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

Jackson,java.time,ISO 8601,序列化无毫秒

我正在使用Jackson 2.8并且需要与ISO 8601时间戳内不允许毫秒的API进行通信.

预期的格式是这样的: "2016-12-24T00:00:00Z"

我正在使用Jackson的JavaTimeModule WRITE_DATES_AS_TIMESTAMPS设置为false.

但这将打印毫秒.

所以我尝试使用objectMapper.setDateFormat哪个没有改变任何东西.

我目前的解决方法是:

ObjectMapper om = new ObjectMapper();

DateTimeFormatter dtf = new DateTimeFormatterBuilder()
    .appendInstant(0)
    .toFormatter();

JavaTimeModule jtm = new JavaTimeModule();
jtm.addSerializer(Instant.class, new JsonSerializer<Instant>() {
    @Override
    public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeString(dtf.format(value));
    }
});

om.registerModule(jtm);
Run Code Online (Sandbox Code Playgroud)

我正在覆盖默认的序列化工具Instant.class.


有没有什么好办法使用一些配置参数来解决这个问题?

java jackson jackson-modules java-time jackson2

12
推荐指数
3
解决办法
9306
查看次数

Jackson定制过滤器,具有完整的POJO数据绑定

这个问题扩展了这个问题.

如果您只有几个字段,之前的解决方案效果很好,那么当您拥有十几个字段时,它就变得无法维护.现在,我当前的设置使用完整的数据绑定,所以我有一个POJO,Jackson将使用它来自动反序列化JSON.

但是,和以前一样,某些字段具有需要通过的约束.基本上,我正在寻找类似于的答案,但无需设置任何属性.只是一个自定义反序列化器,它将充当过滤器,并在字段不符合约束时抛出自定义异常.如果过滤器结束时没有抛出任何异常,Jackson应自动将JSON绑定到POJO.

java json pojo jackson jackson2

11
推荐指数
2
解决办法
568
查看次数

使用Jackson将Instant序列化为ISO8601时强制毫秒

在我使用的项目中,我有一些与使用Jackson的JSON序列化相关的问题Spring Boot 2.0.0.M6,Spring Framework 5.0.1.RELEASE以及Jackson 2.9.2.

我在以下位置配置了以下与Jackson相关的设置application.properties:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
Run Code Online (Sandbox Code Playgroud)

序列化主要按照我的需要工作.尽管如此,我注意到杰克逊似乎已经截止了毫秒数000.

测试1:序列化Instant,毫秒设置为000:

  • 使用初始化Instant字段 Instant.parse("2017-09-14T04:28:48.000Z")
  • 使用Jackson序列化它
  • 输出将是 "2017-09-14T04:28:48Z"

测试2:使用设置为某些非000值的毫秒序列化Instant :

  • 使用初始化Instant字段 Instant.parse("2017-09-14T04:28:48.100Z")
  • 使用Jackson序列化它
  • 输出将是 "2017-09-14T04:28:48.100Z"

问题:

  • 是设计的那种行为?
  • 有什么我可以做的强制序列化000

java spring json spring-boot jackson2

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

如何在循环引用中使用@JsonIdentityInfo?

我试图描述使用@JsonIdentityInfo杰克逊2 这里.

出于测试目的,我创建了以下两个类:

public class A
{
    private B b;
    // constructor(s) and getter/setter omitted
}
public class B
{
    private A a;
    // see above
}
Run Code Online (Sandbox Code Playgroud)

当然,天真的方法很糟糕:

@Test
public void testJacksonJr() throws Exception
{
    A a = new A();
    B b = new B(a);
    a.setB(b);
    String s = JSON.std.asString(a);// throws StackOverflowError
    Assert.assertEquals("{\"@id\":1,\"b\":{\"@id\":2,\"a\":1}}", s);
}
Run Code Online (Sandbox Code Playgroud)

添加@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")到A类和/或B类也不起作用.

我希望我可以序列化(后来反序列化)a到这样的东西:(虽然不太确定JSON)

{
    "b": {
        "@id": 1,
        "a": {
            "@id": 2,
            "b": 1
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

java json circular-reference jackson jackson2

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

如何在spring boot应用程序中将jackson替换为自动封送器和使用jsoniter的unmarshaler

我正在使用带有spring boot的jackson,从json转换为java对象,反之亦然,但我发现这需要花费很多时间,因为json的大小很大,就像2 MB json到相关java对象的编组一样,我们可以使用JSONITER,它表现良好吗?如何在Spring启动时用JSONITER替换JACKSON,目前在弹簧启动应用程序中是否可以使用它?

java json jackson spring-boot jackson2

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

Jackson 错误:无法从 START_ARRAY 令牌反序列化 `java.lang.String` 的实例

嘿,我也有问题,这是我的 Json

[
{
    "aimid": "12345"
},
{
    "aimid": "333674"
},
{
    "aimid": [
        "4568999",
        "6789345"
    ]
}]
Run Code Online (Sandbox Code Playgroud)

这是我的 Pojo 课:-

@JsonProperty("aimid")
private String aimid;


public String getAimid() {
    return aimid;
}

public void setAimid(String aimid) {
    this.aimid = aimid;
}
Run Code Online (Sandbox Code Playgroud)

我想将 aimid 存储在 pojo 中。当我在我的应用程序中像上面那样写时,我收到错误。

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token.
Run Code Online (Sandbox Code Playgroud)

根据我的理解,由于 Array 元素,我遇到了错误,所以任何人都可以建议我如何捕获这两个东西,如果它是作为字符串来的,或者它是作为一个数组字符串来的

java pojo spring-boot jackson2 jackson-databind

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