Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions jackson-modules/jackson-core-3/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>jackson-modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>jackson-core-3</artifactId>

<properties>
<jackson3.version>3.2.1</jackson3.version>
</properties>

<dependencies>
<dependency>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson3.version}</version>
</dependency>

<dependency>
<groupId>tools.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson3.version}</version>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.baeldung.jackson.whatsnew;

import tools.jackson.core.json.JsonWriteFeature;
import tools.jackson.databind.SerializationFeature;
import tools.jackson.databind.cfg.DateTimeFeature;
import tools.jackson.databind.json.JsonMapper;

public class MapperFactory {

public static JsonMapper getMapper() {
return JsonMapper.builder()
.enable(SerializationFeature.INDENT_OUTPUT)
.disable(JsonWriteFeature.ESCAPE_NON_ASCII)
.configure(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.build();
}

public static JsonMapper rebuildPretty(JsonMapper jsonMapper) {
return jsonMapper.rebuild()
.enable(SerializationFeature.INDENT_OUTPUT)
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.baeldung.jackson.whatsnew;

import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;

import static org.assertj.core.api.Assertions.assertThat;

public class DefaultBehaviorTest {

@Test
void givenJsonWithAdditionalField_whenReadValue_thenSuccessWithoutUnknownField() {
var json = "{\"name\":\"Alice\", \"unknownField\":\"ignored_value\"}";
var mapper = MapperFactory.getMapper();

var user = mapper.readValue(json, User.class);

assertThat(user)
.returns("Alice", User::name);
}

private record User(String name) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.baeldung.jackson.whatsnew;

import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;

public class Java8FeaturesTest {

@Test
void givenJava8TypesAndNoConfiguration_whenWriteValueAsString_thenSuccess() {
var now = LocalDateTime.now();
var event = new Event("Tech Talk", Optional.of("Jackson 3 overview"), now);
var mapper = MapperFactory.getMapper();

var json = mapper.writeValueAsString(event);
assertThat(json)
.isEqualTo("""
{
"title" : "Tech Talk",
"description" : "Jackson 3 overview",
"eventDate" : "<now>"
}""".replace("<now>", now.toString()));
var deserialized = mapper.readValue(json, Event.class);
assertThat(deserialized)
.isEqualTo(event);
}

private record Event(String title, Optional<String> description, LocalDateTime eventDate) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.baeldung.jackson.whatsnew;

import org.junit.jupiter.api.Test;

import java.util.OptionalInt;

import static org.assertj.core.api.Assertions.assertThat;

public class JsonNodeTest {

@Test
void givenJson_whenReadTree_thenValueAccessorEnhanced() {
var json = "{\"product\":\"Laptop\",\"price\":1200}";
var root = MapperFactory.getMapper().readTree(json);

var product = root.get("product").asString();
var price = root.get("price").intValueOpt();

assertThat(product)
.isEqualTo("Laptop");
assertThat(price)
.isEqualTo(OptionalInt.of(1200));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.baeldung.jackson.whatsnew;

import org.junit.jupiter.api.Test;
import tools.jackson.databind.SerializationFeature;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;

class MapperFactoryTest {

@Test
void whenGetMapper_thenSuccess() {
assertThatNoException().isThrownBy(MapperFactory::getMapper);
}

@Test
void givenMapper_whenRebuildPretty_thenSuccess() {
var mapper = MapperFactory.getMapper();

var prettyMapper = MapperFactory.rebuildPretty(mapper);

assertThat(prettyMapper)
.isNotNull()
.isNotSameAs(mapper)
.returns(true, m -> m.isEnabled(SerializationFeature.INDENT_OUTPUT));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.baeldung.jackson.whatsnew;

import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

public class UncheckedExceptionTest {

@Test
void givenMapperAndUserRecord_whenReadValue_thenSuccessNoTryCatchNeeded() {
var jsonPayloads = List.of("{\"name\":\"Matt\"}", "{\"name\":\"Jack\"}");
var mapper = MapperFactory.getMapper();

var users = jsonPayloads.stream()
.map(json -> mapper.readValue(json, User.class))
.toList();

assertThat(users)
.hasSize(2)
.containsExactlyInAnyOrder(new User("Matt"), new User("Jack"));
}

private record User(String name) {}
}
1 change: 1 addition & 0 deletions jackson-modules/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
<module>jackson-exceptions</module>
<module>jackson-jr</module>
<module>jackson-polymorphic-deserialization</module>
<module>jackson-core-3</module>
</modules>

<dependencies>
Expand Down