eclipse-ee4j / eclipse-ee4j/yasson

Custom De-Serialization Bug

Open
#342 7 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.