Merge pull request #8227 from catalin-burcea/BAEL-19673

[BAEL-19673] - Move articles out of jackson part 1
This commit is contained in:
Josh Cummings 2019-11-23 11:29:56 -07:00 committed by GitHub
commit 543fb9d398
97 changed files with 894 additions and 210 deletions

View File

@ -0,0 +1,11 @@
## Jackson Annotations
This module contains articles about Jackson annotations.
### Relevant Articles:
- [Guide to @JsonFormat in Jackson](https://www.baeldung.com/jackson-jsonformat)
- [More Jackson Annotations](https://www.baeldung.com/jackson-advanced-annotations)
- [Jackson Annotation Examples](https://www.baeldung.com/jackson-annotations)
- [Jackson Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
- [Jackson Change Name of Field](https://www.baeldung.com/jackson-name-of-property)
- [Jackson Ignore Properties on Marshalling](https://www.baeldung.com/jackson-ignore-properties-on-serialization)

View File

@ -0,0 +1,60 @@
<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>
<artifactId>jackson-annotations</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jackson-annotations</name>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent-java</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jsonSchema</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>${rest-assured.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>jackson-annotations</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<properties>
<assertj.version>3.11.0</assertj.version>
<rest-assured.version>3.1.1</rest-assured.version>
</properties>
</project>

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.bidirection;
package com.baeldung.jackson.annotation.bidirection;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.bidirection;
package com.baeldung.jackson.annotation.bidirection;
public class ItemWithIgnore {
public int id;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.bidirection;
package com.baeldung.jackson.annotation.bidirection;
import com.fasterxml.jackson.annotation.JsonManagedReference;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.bidirection;
package com.baeldung.jackson.annotation.bidirection;
import java.util.ArrayList;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.bidirection;
package com.baeldung.jackson.annotation.bidirection;
import java.util.ArrayList;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.bidirection;
package com.baeldung.jackson.annotation.bidirection;
import java.util.ArrayList;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.date;
package com.baeldung.jackson.annotation.date;
import java.io.IOException;
import java.text.ParseException;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.date;
package com.baeldung.jackson.annotation.date;
import java.io.IOException;
import java.text.SimpleDateFormat;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.date;
package com.baeldung.jackson.annotation.date;
import java.util.Date;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.date;
package com.baeldung.jackson.annotation.date;
import java.util.Date;

View File

@ -0,0 +1,41 @@
package com.baeldung.jackson.annotation.deserialization;
import java.io.IOException;
import com.baeldung.jackson.annotation.dtos.ItemWithSerializer;
import com.baeldung.jackson.annotation.dtos.User;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.node.IntNode;
public class ItemDeserializerOnClass extends StdDeserializer<ItemWithSerializer> {
private static final long serialVersionUID = 5579141241817332594L;
public ItemDeserializerOnClass() {
this(null);
}
public ItemDeserializerOnClass(final Class<?> vc) {
super(vc);
}
/**
* {"id":1,"itemNr":"theItem","owner":2}
*/
@Override
public ItemWithSerializer deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException, JsonProcessingException {
final JsonNode node = jp.getCodec()
.readTree(jp);
final int id = (Integer) ((IntNode) node.get("id")).numberValue();
final String itemName = node.get("itemName")
.asText();
final int userId = (Integer) ((IntNode) node.get("owner")).numberValue();
return new ItemWithSerializer(id, itemName, new User(userId, null));
}
}

View File

@ -0,0 +1,32 @@
package com.baeldung.jackson.annotation.dtos;
public class Item {
public int id;
public String itemName;
public User owner;
public Item() {
super();
}
public Item(final int id, final String itemName, final User owner) {
this.id = id;
this.itemName = itemName;
this.owner = owner;
}
// API
public int getId() {
return id;
}
public String getItemName() {
return itemName;
}
public User getOwner() {
return owner;
}
}

View File

@ -0,0 +1,36 @@
package com.baeldung.jackson.annotation.dtos;
import com.baeldung.jackson.annotation.deserialization.ItemDeserializerOnClass;
import com.baeldung.jackson.annotation.serialization.ItemSerializerOnClass;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(using = ItemSerializerOnClass.class)
@JsonDeserialize(using = ItemDeserializerOnClass.class)
public class ItemWithSerializer {
public final int id;
public final String itemName;
public final User owner;
public ItemWithSerializer(final int id, final String itemName, final User owner) {
this.id = id;
this.itemName = itemName;
this.owner = owner;
}
// API
public int getId() {
return id;
}
public String getItemName() {
return itemName;
}
public User getOwner() {
return owner;
}
}

View File

@ -0,0 +1,26 @@
package com.baeldung.jackson.annotation.dtos;
public class User {
public int id;
public String name;
public User() {
super();
}
public User(final int id, final String name) {
this.id = id;
this.name = name;
}
// API
public int getId() {
return id;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,29 @@
package com.baeldung.jackson.annotation.dtos.withEnum;
import com.fasterxml.jackson.annotation.JsonValue;
public enum DistanceEnumWithValue {
KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
private String unit;
private final double meters;
private DistanceEnumWithValue(String unit, double meters) {
this.unit = unit;
this.meters = meters;
}
@JsonValue
public double getMeters() {
return meters;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception;
package com.baeldung.jackson.annotation.exception;
import com.fasterxml.jackson.annotation.JsonRootName;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception;
package com.baeldung.jackson.annotation.exception;
import com.fasterxml.jackson.annotation.JsonRootName;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.jsonview;
package com.baeldung.jackson.annotation.jsonview;
import com.fasterxml.jackson.annotation.JsonView;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.jsonview;
package com.baeldung.jackson.annotation.jsonview;
public class Views {
public static class Public {

View File

@ -0,0 +1,32 @@
package com.baeldung.jackson.annotation.serialization;
import java.io.IOException;
import com.baeldung.jackson.annotation.dtos.Item;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class ItemSerializer extends StdSerializer<Item> {
private static final long serialVersionUID = 6739170890621978901L;
public ItemSerializer() {
this(null);
}
public ItemSerializer(final Class<Item> t) {
super(t);
}
@Override
public final void serialize(final Item value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeStringField("itemName", value.itemName);
jgen.writeNumberField("owner", value.owner.id);
jgen.writeEndObject();
}
}

View File

@ -0,0 +1,32 @@
package com.baeldung.jackson.annotation.serialization;
import java.io.IOException;
import com.baeldung.jackson.annotation.dtos.ItemWithSerializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class ItemSerializerOnClass extends StdSerializer<ItemWithSerializer> {
private static final long serialVersionUID = -1760959597313610409L;
public ItemSerializerOnClass() {
this(null);
}
public ItemSerializerOnClass(final Class<ItemWithSerializer> t) {
super(t);
}
@Override
public final void serialize(final ItemWithSerializer value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeStringField("itemName", value.itemName);
jgen.writeNumberField("owner", value.owner.id);
jgen.writeEndObject();
}
}

View File

@ -1,6 +1,6 @@
package com.baeldung.jackson.bidirection;
import com.baeldung.jackson.jsonview.Views;
import com.baeldung.jackson.bidirection.jsonview.Views;
import com.fasterxml.jackson.annotation.JsonView;

View File

@ -3,7 +3,7 @@ package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
import com.baeldung.jackson.jsonview.Views;
import com.baeldung.jackson.bidirection.jsonview.Views;
import com.fasterxml.jackson.annotation.JsonView;

View File

@ -0,0 +1,9 @@
package com.baeldung.jackson.bidirection.jsonview;
public class Views {
public static class Public {
}
public static class Internal extends Public {
}
}

View File

@ -0,0 +1,30 @@
package com.baeldung.jackson.domain;
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
super();
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.instanceOf;
@ -12,10 +12,10 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.baeldung.jackson.annotation.extra.AppendBeans.BeanWithAppend;
import com.baeldung.jackson.annotation.extra.AppendBeans.BeanWithoutAppend;
import com.baeldung.jackson.annotation.extra.IdentityReferenceBeans.BeanWithIdentityReference;
import com.baeldung.jackson.annotation.extra.IdentityReferenceBeans.BeanWithoutIdentityReference;
import com.baeldung.jackson.advancedannotations.AppendBeans.BeanWithAppend;
import com.baeldung.jackson.advancedannotations.AppendBeans.BeanWithoutAppend;
import com.baeldung.jackson.advancedannotations.IdentityReferenceBeans.BeanWithIdentityReference;
import com.baeldung.jackson.advancedannotations.IdentityReferenceBeans.BeanWithoutIdentityReference;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
@ -23,7 +23,7 @@ import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
public class ExtraAnnotationUnitTest {
public class AdvancedAnnotationsUnitTest {
@Test
public void whenNotUsingJsonIdentityReferenceAnnotation_thenCorrect() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import com.fasterxml.jackson.databind.annotation.JsonAppend;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import com.fasterxml.jackson.annotation.JsonTypeId;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.annotation.extra;
package com.baeldung.jackson.advancedannotations;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.test;
package com.baeldung.jackson.annotation;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
@ -14,32 +14,18 @@ import java.util.TimeZone;
import org.junit.Test;
import com.baeldung.jackson.annotation.AliasBean;
import com.baeldung.jackson.annotation.BeanWithCreator;
import com.baeldung.jackson.annotation.BeanWithCustomAnnotation;
import com.baeldung.jackson.annotation.BeanWithFilter;
import com.baeldung.jackson.annotation.BeanWithGetter;
import com.baeldung.jackson.annotation.BeanWithIgnore;
import com.baeldung.jackson.annotation.BeanWithInject;
import com.baeldung.jackson.annotation.ExtendableBean;
import com.baeldung.jackson.annotation.MyBean;
import com.baeldung.jackson.annotation.PrivateBean;
import com.baeldung.jackson.annotation.RawBean;
import com.baeldung.jackson.annotation.UnwrappedUser;
import com.baeldung.jackson.annotation.UserWithIgnoreType;
import com.baeldung.jackson.annotation.Zoo;
import com.baeldung.jackson.bidirection.ItemWithIdentity;
import com.baeldung.jackson.bidirection.ItemWithRef;
import com.baeldung.jackson.bidirection.UserWithIdentity;
import com.baeldung.jackson.bidirection.UserWithRef;
import com.baeldung.jackson.date.EventWithFormat;
import com.baeldung.jackson.date.EventWithSerializer;
import com.baeldung.jackson.dtos.MyMixInForIgnoreType;
import com.baeldung.jackson.dtos.withEnum.DistanceEnumWithValue;
import com.baeldung.jackson.exception.UserWithRoot;
import com.baeldung.jackson.exception.UserWithRootNamespace;
import com.baeldung.jackson.jsonview.Item;
import com.baeldung.jackson.jsonview.Views;
import com.baeldung.jackson.annotation.bidirection.ItemWithIdentity;
import com.baeldung.jackson.annotation.bidirection.ItemWithRef;
import com.baeldung.jackson.annotation.bidirection.UserWithIdentity;
import com.baeldung.jackson.annotation.bidirection.UserWithRef;
import com.baeldung.jackson.annotation.date.EventWithFormat;
import com.baeldung.jackson.annotation.date.EventWithSerializer;
import com.baeldung.jackson.ignore.dtos.MyMixInForIgnoreType;
import com.baeldung.jackson.annotation.dtos.withEnum.DistanceEnumWithValue;
import com.baeldung.jackson.annotation.exception.UserWithRoot;
import com.baeldung.jackson.annotation.exception.UserWithRootNamespace;
import com.baeldung.jackson.annotation.jsonview.Item;
import com.baeldung.jackson.annotation.jsonview.Views;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.InjectableValues;
import com.fasterxml.jackson.databind.MapperFeature;
@ -352,13 +338,13 @@ public class JacksonAnnotationUnitTest {
// @Ignore("Jackson 2.7.1-1 seems to have changed the API regarding mixins")
@Test
public void whenSerializingUsingMixInAnnotation_thenCorrect() throws JsonProcessingException {
final com.baeldung.jackson.dtos.Item item = new com.baeldung.jackson.dtos.Item(1, "book", null);
final com.baeldung.jackson.annotation.dtos.Item item = new com.baeldung.jackson.annotation.dtos.Item(1, "book", null);
String result = new ObjectMapper().writeValueAsString(item);
assertThat(result, containsString("owner"));
final ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(com.baeldung.jackson.dtos.User.class, MyMixInForIgnoreType.class);
mapper.addMixIn(com.baeldung.jackson.annotation.dtos.User.class, MyMixInForIgnoreType.class);
result = mapper.writeValueAsString(item);
assertThat(result, not(containsString("owner")));

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.test;
package com.baeldung.jackson.bidirection;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@ -9,19 +9,7 @@ import java.io.IOException;
import org.junit.Test;
import com.baeldung.jackson.bidirection.Item;
import com.baeldung.jackson.bidirection.ItemWithIdentity;
import com.baeldung.jackson.bidirection.ItemWithIgnore;
import com.baeldung.jackson.bidirection.ItemWithRef;
import com.baeldung.jackson.bidirection.ItemWithSerializer;
import com.baeldung.jackson.bidirection.ItemWithView;
import com.baeldung.jackson.bidirection.User;
import com.baeldung.jackson.bidirection.UserWithIdentity;
import com.baeldung.jackson.bidirection.UserWithIgnore;
import com.baeldung.jackson.bidirection.UserWithRef;
import com.baeldung.jackson.bidirection.UserWithSerializer;
import com.baeldung.jackson.bidirection.UserWithView;
import com.baeldung.jackson.jsonview.Views;
import com.baeldung.jackson.bidirection.jsonview.Views;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@ -10,15 +10,15 @@ import java.util.Map;
import org.junit.Test;
import com.baeldung.jackson.dtos.MyDto;
import com.baeldung.jackson.dtos.MyDtoIncludeNonDefault;
import com.baeldung.jackson.dtos.MyDtoWithFilter;
import com.baeldung.jackson.dtos.MyDtoWithSpecialField;
import com.baeldung.jackson.dtos.MyMixInForIgnoreType;
import com.baeldung.jackson.ignore.dtos.MyDto;
import com.baeldung.jackson.ignore.dtos.MyDtoIncludeNonDefault;
import com.baeldung.jackson.ignore.dtos.MyDtoWithFilter;
import com.baeldung.jackson.ignore.dtos.MyDtoWithSpecialField;
import com.baeldung.jackson.ignore.dtos.MyMixInForIgnoreType;
import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreField;
import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreFieldByName;
import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreNull;
import com.baeldung.jackson.serialization.MyDtoNullKeySerializer;
import com.baeldung.jackson.ignore.dtos.MyDtoNullKeySerializer;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;

View File

@ -0,0 +1,54 @@
package com.baeldung.jackson.ignore.dtos;
public class MyDto {
private String stringValue;
private int intValue;
private boolean booleanValue;
public MyDto() {
super();
}
public MyDto(final String stringValue, final int intValue, final boolean booleanValue) {
super();
this.stringValue = stringValue;
this.intValue = intValue;
this.booleanValue = booleanValue;
}
// API
public String getStringValue() {
return stringValue;
}
public void setStringValue(final String stringValue) {
this.stringValue = stringValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(final int intValue) {
this.intValue = intValue;
}
public boolean isBooleanValue() {
return booleanValue;
}
public void setBooleanValue(final boolean booleanValue) {
this.booleanValue = booleanValue;
}
//
@Override
public String toString() {
return "MyDto [stringValue=" + stringValue + ", intValue=" + intValue + ", booleanValue=" + booleanValue + "]";
}
}

View File

@ -0,0 +1,43 @@
package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@JsonInclude(Include.NON_DEFAULT)
public class MyDtoIncludeNonDefault {
private String stringValue;
private int intValue;
private boolean booleanValue;
public MyDtoIncludeNonDefault() {
super();
}
// API
public String getStringValue() {
return stringValue;
}
public void setStringValue(final String stringValue) {
this.stringValue = stringValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(final int intValue) {
this.intValue = intValue;
}
public boolean isBooleanValue() {
return booleanValue;
}
public void setBooleanValue(final boolean booleanValue) {
this.booleanValue = booleanValue;
}
}

View File

@ -1,27 +1,27 @@
package com.baeldung.jackson.serialization;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class MyDtoNullKeySerializer extends StdSerializer<Object> {
private static final long serialVersionUID = -4478531309177369056L;
public MyDtoNullKeySerializer() {
this(null);
}
public MyDtoNullKeySerializer(final Class<Object> t) {
super(t);
}
@Override
public void serialize(final Object value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeFieldName("");
}
}
package com.baeldung.jackson.ignore.dtos;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class MyDtoNullKeySerializer extends StdSerializer<Object> {
private static final long serialVersionUID = -4478531309177369056L;
public MyDtoNullKeySerializer() {
this(null);
}
public MyDtoNullKeySerializer(final Class<Object> t) {
super(t);
}
@Override
public void serialize(final Object value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeFieldName("");
}
}

View File

@ -0,0 +1,50 @@
package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonFilter;
@JsonFilter("myFilter")
public class MyDtoWithFilter {
private String stringValue;
private int intValue;
private boolean booleanValue;
public MyDtoWithFilter() {
super();
}
public MyDtoWithFilter(final String stringValue, final int intValue, final boolean booleanValue) {
super();
this.stringValue = stringValue;
this.intValue = intValue;
this.booleanValue = booleanValue;
}
// API
public String getStringValue() {
return stringValue;
}
public void setStringValue(final String stringValue) {
this.stringValue = stringValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(final int intValue) {
this.intValue = intValue;
}
public boolean isBooleanValue() {
return booleanValue;
}
public void setBooleanValue(final boolean booleanValue) {
this.booleanValue = booleanValue;
}
}

View File

@ -0,0 +1,54 @@
package com.baeldung.jackson.ignore.dtos;
public class MyDtoWithSpecialField {
private String[] stringValue;
private int intValue;
private boolean booleanValue;
public MyDtoWithSpecialField() {
super();
}
public MyDtoWithSpecialField(final String[] stringValue, final int intValue, final boolean booleanValue) {
super();
this.stringValue = stringValue;
this.intValue = intValue;
this.booleanValue = booleanValue;
}
// API
public String[] getStringValue() {
return stringValue;
}
public void setStringValue(final String[] stringValue) {
this.stringValue = stringValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(final int intValue) {
this.intValue = intValue;
}
public boolean isBooleanValue() {
return booleanValue;
}
public void setBooleanValue(final boolean booleanValue) {
this.booleanValue = booleanValue;
}
//
@Override
public String toString() {
return "MyDto [stringValue=" + stringValue + ", intValue=" + intValue + ", booleanValue=" + booleanValue + "]";
}
}

View File

@ -0,0 +1,8 @@
package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
@JsonIgnoreType
public class MyMixInForIgnoreType {
//
}

View File

@ -0,0 +1,44 @@
package com.baeldung.jackson.jsonproperty;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
public class JsonPropertyUnitTest {
@Test
public final void whenSerializing_thenCorrect() throws JsonParseException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final String dtoAsString = mapper.writeValueAsString(new MyDto());
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("stringValue"));
assertThat(dtoAsString, containsString("booleanValue"));
}
@Test
public final void givenNameOfFieldIsChangedViaAnnotationOnGetter_whenSerializing_thenCorrect() throws JsonParseException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final MyDtoFieldNameChanged dtoObject = new MyDtoFieldNameChanged();
dtoObject.setStringValue("a");
final String dtoAsString = mapper.writeValueAsString(dtoObject);
assertThat(dtoAsString, not(containsString("stringValue")));
assertThat(dtoAsString, containsString("strVal"));
System.out.println(dtoAsString);
}
}

View File

@ -0,0 +1,54 @@
package com.baeldung.jackson.jsonproperty;
public class MyDto {
private String stringValue;
private int intValue;
private boolean booleanValue;
public MyDto() {
super();
}
public MyDto(final String stringValue, final int intValue, final boolean booleanValue) {
super();
this.stringValue = stringValue;
this.intValue = intValue;
this.booleanValue = booleanValue;
}
// API
public String getStringValue() {
return stringValue;
}
public void setStringValue(final String stringValue) {
this.stringValue = stringValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(final int intValue) {
this.intValue = intValue;
}
public boolean isBooleanValue() {
return booleanValue;
}
public void setBooleanValue(final boolean booleanValue) {
this.booleanValue = booleanValue;
}
//
@Override
public String toString() {
return "MyDto [stringValue=" + stringValue + ", intValue=" + intValue + ", booleanValue=" + booleanValue + "]";
}
}

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.dtos;
package com.baeldung.jackson.jsonproperty;
import com.fasterxml.jackson.annotation.JsonProperty;

View File

@ -0,0 +1,7 @@
## Jackson Exceptions
This module contains articles about Jackson exceptions.
### Relevant Articles:
- [Jackson Exceptions Problems and Solutions](https://www.baeldung.com/jackson-exception)
- [Jackson JsonMappingException (No serializer found for class)](https://www.baeldung.com/jackson-jsonmappingexception)

View File

@ -0,0 +1,33 @@
<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>
<artifactId>jackson-exceptions</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jackson-exceptions</name>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent-java</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
<build>
<finalName>jackson-exceptions</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>

View File

@ -0,0 +1,26 @@
package com.baeldung.exceptions;
public class User {
public int id;
public String name;
public User() {
super();
}
public User(final int id, final String name) {
this.id = id;
this.name = name;
}
// API
public int getId() {
return id;
}
public String getName() {
return name;
}
}

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception;
package com.baeldung.exceptions;
public class UserWithConflict {
public int id;

View File

@ -0,0 +1,21 @@
package com.baeldung.exceptions;
public class UserWithNoDefaultConstructor {
private int id;
private String name;
public UserWithNoDefaultConstructor(final int id, final String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception;
package com.baeldung.exceptions;
public class UserWithPrivateFields {
int id;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception;
package com.baeldung.exceptions;
import com.fasterxml.jackson.annotation.JsonRootName;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception;
package com.baeldung.exceptions;
public class Zoo {
public Animal animal;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception;
package com.baeldung.exceptions;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.dtos;
package com.baeldung.mappingexception;
public class MyDtoNoAccessors {

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.dtos;
package com.baeldung.mappingexception;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.exception.test;
package com.baeldung.exceptions;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
@ -9,11 +9,11 @@ import java.util.List;
import org.junit.Test;
import com.baeldung.jackson.exception.User;
import com.baeldung.jackson.exception.UserWithPrivateFields;
import com.baeldung.jackson.exception.UserWithRoot;
import com.baeldung.jackson.exception.Zoo;
import com.baeldung.jackson.exception.ZooConfigured;
import com.baeldung.exceptions.User;
import com.baeldung.exceptions.UserWithPrivateFields;
import com.baeldung.exceptions.UserWithRoot;
import com.baeldung.exceptions.Zoo;
import com.baeldung.exceptions.ZooConfigured;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonFactory;
@ -78,7 +78,7 @@ public class JacksonExceptionsUnitTest {
final ObjectMapper mapper = new ObjectMapper();
mapper.reader()
.forType(User.class)
.forType(UserWithNoDefaultConstructor.class)
.readValue(json);
}
@ -87,8 +87,8 @@ public class JacksonExceptionsUnitTest {
final String json = "{\"id\":1,\"name\":\"John\"}";
final ObjectMapper mapper = new ObjectMapper();
final com.baeldung.jackson.dtos.User user = mapper.reader()
.forType(com.baeldung.jackson.dtos.User.class)
final User user = mapper.reader()
.forType(User.class)
.readValue(json);
assertEquals("John", user.name);
}
@ -102,7 +102,7 @@ public class JacksonExceptionsUnitTest {
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
mapper.reader()
.forType(com.baeldung.jackson.dtos.User.class)
.forType(User.class)
.readValue(json);
}
@ -126,7 +126,7 @@ public class JacksonExceptionsUnitTest {
final ObjectMapper mapper = new ObjectMapper();
mapper.reader()
.forType(com.baeldung.jackson.dtos.User.class)
.forType(User.class)
.readValue(json);
}
@ -135,8 +135,8 @@ public class JacksonExceptionsUnitTest {
final String json = "[{\"id\":1,\"name\":\"John\"},{\"id\":2,\"name\":\"Adam\"}]";
final ObjectMapper mapper = new ObjectMapper();
final List<com.baeldung.jackson.dtos.User> users = mapper.reader()
.forType(new TypeReference<List<com.baeldung.jackson.dtos.User>>() {
final List<User> users = mapper.reader()
.forType(new TypeReference<List<User>>() {
})
.readValue(json);
@ -150,7 +150,7 @@ public class JacksonExceptionsUnitTest {
final ObjectMapper mapper = new ObjectMapper();
mapper.reader()
.forType(com.baeldung.jackson.dtos.User.class)
.forType(User.class)
.readValue(json);
}
@ -161,8 +161,8 @@ public class JacksonExceptionsUnitTest {
final ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
final com.baeldung.jackson.dtos.User user = mapper.reader()
.forType(com.baeldung.jackson.dtos.User.class)
final User user = mapper.reader()
.forType(User.class)
.readValue(json);
assertEquals("John", user.name);
}
@ -174,7 +174,7 @@ public class JacksonExceptionsUnitTest {
final ObjectMapper mapper = new ObjectMapper();
mapper.reader()
.forType(com.baeldung.jackson.dtos.User.class)
.forType(User.class)
.readValue(json);
}
@ -186,8 +186,8 @@ public class JacksonExceptionsUnitTest {
factory.enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
final ObjectMapper mapper = new ObjectMapper(factory);
final com.baeldung.jackson.dtos.User user = mapper.reader()
.forType(com.baeldung.jackson.dtos.User.class)
final User user = mapper.reader()
.forType(User.class)
.readValue(json);
assertEquals("John", user.name);
}

View File

@ -0,0 +1,51 @@
package com.baeldung.mappingexception;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.google.common.collect.Lists;
public class JacksonMappingExceptionUnitTest {
@Test(expected = JsonMappingException.class)
public final void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException {
final String dtoAsString = new ObjectMapper().writeValueAsString(new MyDtoNoAccessors());
assertThat(dtoAsString, notNullValue());
}
@Test
public final void givenObjectHasNoAccessors_whenSerializingWithPrivateFieldsVisibility_thenNoException() throws JsonParseException, IOException {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessors());
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("stringValue"));
assertThat(dtoAsString, containsString("booleanValue"));
}
@Test
public final void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException() throws JsonParseException, IOException {
final ObjectMapper objectMapper = new ObjectMapper();
final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessorsAndFieldVisibility());
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("stringValue"));
assertThat(dtoAsString, containsString("booleanValue"));
}
}

View File

@ -7,9 +7,6 @@ This module contains articles about Jackson that are also part of the Jackson Eb
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
- [Jackson Ignore Properties on Marshalling](https://www.baeldung.com/jackson-ignore-properties-on-serialization)
- [Jackson Unmarshalling json with Unknown Properties](https://www.baeldung.com/jackson-deserialize-json-unknown-properties)
- [Jackson Annotation Examples](https://www.baeldung.com/jackson-annotations)
- [Intro to the Jackson ObjectMapper](https://www.baeldung.com/jackson-object-mapper-tutorial)
- [Ignore Null Fields with Jackson](https://www.baeldung.com/jackson-ignore-null-fields)
- [Jackson Change Name of Field](https://www.baeldung.com/jackson-name-of-property)

View File

@ -1,4 +1,4 @@
package com.baeldung.jackson.dtos.withEnum;
package com.baeldung.jackson.annotation.dtos.withEnum;
import com.fasterxml.jackson.annotation.JsonValue;

View File

@ -8,13 +8,10 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.List;
import com.baeldung.jackson.dtos.MyDtoFieldNameChanged;
import com.baeldung.jackson.dtos.User;
import com.baeldung.jackson.dtos.Item;
import com.baeldung.jackson.dtos.ItemWithSerializer;
import com.baeldung.jackson.dtos.MyDto;
import com.baeldung.jackson.dtos.MyDtoNoAccessors;
import com.baeldung.jackson.dtos.MyDtoNoAccessorsAndFieldVisibility;
import com.baeldung.jackson.serialization.ItemSerializer;
import org.junit.Test;
@ -29,61 +26,6 @@ import com.google.common.collect.Lists;
public class JacksonSerializationUnitTest {
// tests - single entity to json
@Test
public final void whenSerializing_thenCorrect() throws JsonParseException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final String dtoAsString = mapper.writeValueAsString(new MyDto());
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("stringValue"));
assertThat(dtoAsString, containsString("booleanValue"));
}
@Test
public final void givenNameOfFieldIsChangedViaAnnotationOnGetter_whenSerializing_thenCorrect() throws JsonParseException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final MyDtoFieldNameChanged dtoObject = new MyDtoFieldNameChanged();
dtoObject.setStringValue("a");
final String dtoAsString = mapper.writeValueAsString(dtoObject);
assertThat(dtoAsString, not(containsString("stringValue")));
assertThat(dtoAsString, containsString("strVal"));
System.out.println(dtoAsString);
}
// tests - serialize via accessors/fields
@Test(expected = JsonMappingException.class)
public final void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException {
final String dtoAsString = new ObjectMapper().writeValueAsString(new MyDtoNoAccessors());
assertThat(dtoAsString, notNullValue());
}
@Test
public final void givenObjectHasNoAccessors_whenSerializingWithPrivateFieldsVisibility_thenNoException() throws JsonParseException, IOException {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessors());
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("stringValue"));
assertThat(dtoAsString, containsString("booleanValue"));
}
@Test
public final void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException() throws JsonParseException, IOException {
final ObjectMapper objectMapper = new ObjectMapper();
final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessorsAndFieldVisibility());
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("stringValue"));
assertThat(dtoAsString, containsString("booleanValue"));
}
// tests - multiple entities to json
@Test

View File

@ -11,21 +11,16 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Jackson Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array)
- [Jackson Custom Serializer](https://www.baeldung.com/jackson-custom-serialization)
- [Getting Started with Custom Deserialization in Jackson](https://www.baeldung.com/jackson-deserialization)
- [Jackson Exceptions Problems and Solutions](https://www.baeldung.com/jackson-exception)
- [Jackson Date](https://www.baeldung.com/jackson-serialize-dates)
- [Jackson Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
- [Jackson JSON Tutorial](https://www.baeldung.com/jackson)
- [Jackson Working with Maps and nulls](https://www.baeldung.com/jackson-map-null-values-or-null-key)
- [Jackson Decide What Fields Get Serialized/Deserialized](https://www.baeldung.com/jackson-field-serializable-deserializable-or-not)
- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson)
- [XML Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-xml-serialization-and-deserialization)
- [More Jackson Annotations](https://www.baeldung.com/jackson-advanced-annotations)
- [Inheritance with Jackson](https://www.baeldung.com/jackson-inheritance)
- [Guide to @JsonFormat in Jackson](https://www.baeldung.com/jackson-jsonformat)
- [Using Optional with Jackson](https://www.baeldung.com/jackson-optional)
- [Map Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-map)
- [Jackson Streaming API](https://www.baeldung.com/jackson-streaming-api)
- [Jackson JsonMappingException (No serializer found for class)](https://www.baeldung.com/jackson-jsonmappingexception)
- [How To Serialize and Deserialize Enums with Jackson](https://www.baeldung.com/jackson-serialize-enums)
- [Jackson Marshall String to JsonNode](https://www.baeldung.com/jackson-json-to-jsonnode)
- [Jackson Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array)

View File

@ -1,11 +0,0 @@
package com.baeldung.jackson.exception;
public class User {
public int id;
public String name;
public User(final int id, final String name) {
this.id = id;
this.name = name;
}
}

View File

@ -499,6 +499,8 @@
<module>jackson</module>
<module>jackson-2</module>
<module>jackson-simple</module>
<module>jackson-annotations</module>
<module>jackson-exceptions</module>
<module>java-collections-conversions</module>
<module>java-collections-conversions-2</module>
<module>java-collections-maps</module>
@ -1266,6 +1268,8 @@
<module>jackson</module>
<module>jackson-2</module>
<module>jackson-simple</module>
<module>jackson-annotations</module>
<module>jackson-exceptions</module>
<module>java-collections-conversions</module>
<module>java-collections-conversions-2</module>
<module>java-collections-maps</module>