eclipse-ee4j / eclipse-ee4j/yasson
Custom De-Serialization Bug
- Dominant language
- Java
- Stars
- 218
- Forks
- 109
- Avg merge
- 1d 5h
- Merged PRs (30d)
- 9
Description
Yasson Version: 1.0.4
Java Version: 11.0.2
OS: Windows 10
When using a custom deserializer for a parameter of an object, any parameter object that comes after that custom deserialized object in the json string is not deserialized and is set to its default value (null, 0, etc.).
Example:
```java
import java.util.List;
import javax.json.bind.annotation.JsonbTypeDeserializer;
public class A {
private double a;
@JsonbTypeDeserializer(BDeserializer.class)
private List b;
private String c;
public A() {
}
A(double a, List b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
public double getA() {
return a;
}
public void setA(final double a) {
this.a = a;
}
public List getB() {
return b;
}
public void setB(final List bObject) {
this.b = bObject;
}
public String getC() {
return c;
}
public void setC(final String c) {
this.c = c;
}
}
```
```java
public class B {
String bString;
public B() {
}
public B(String b) {
this.bString = b;
}
public String getbString() {
return bString;
}
public void setbString(final String b) {
this.bString = b;
}
}
```
```java
import java.lang.reflect.Type;
import java.util.List;
import java.util.stream.Collectors;
import javax.json.JsonValue;
import javax.json.bind.serializer.DeserializationContext;
import javax.json.bind.serializer.JsonbDeserializer;
import javax.json.stream.JsonParser;
public class BDeserializer implements JsonbDeserializer> {
@Override
public List deserialize(final JsonParser parser, final DeserializationContext ctx, final Type rtType) {
final JsonValue arr = parser.getValue();
return arr.asJsonArray().stream().map(i -> new B(i.toString())).collect(Collectors.toList());
}
}
```
```java
import java.util.List;
import javax.json.bind.Jsonb;
import javax.json.bind.spi.JsonbProvider;
import org.junit.jupiter.api.Test;
class Driver {
private Jsonb jsonb = JsonbProvider.provider().create().build();
@Test
void test() {
A a = new A(2.0, List.of(new B("test")), "test1");
String json = jsonb.toJson(a);
System.out.println("Serialized Result: " + json);
A actual = jsonb.fromJson(json, A.class);
System.out.println("Deserialized C Value: " + actual.getC());
}
}
```
Output:
Serialized Result: {"a":2.0,"b":[{"bString":"test"}],"c":"test1"}
Deserialized C Value: null
Output after commenting out `@JsonbTypeDeserializer(BDeserializer.class)` in A class:
Serialized Result: {"a":2.0,"b":[{"bString":"test"}],"c":"test1"}
Deserialized C Value: test1
Contributor guide
Assessment
This issue has not been assessed yet.