This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push:
new c6d9661 JOHNZON-224 support JsonValue in adapters (parsing side)
c6d9661 is described below
commit c6d9661a05f0eae3e7fbd39b7210282d3afe9816
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Fri Jul 26 07:21:44 2019 +0200
JOHNZON-224 support JsonValue in adapters (parsing side)
---
.../java/org/apache/johnzon/jsonb/AdapterTest.java | 66 ++++++++++++++++++----
.../johnzon/mapper/MappingGeneratorImpl.java | 3 +
.../apache/johnzon/mapper/MappingParserImpl.java | 31 ++++++++--
3 files changed, 84 insertions(+), 16 deletions(-)
diff --git
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
index d6b8a05..d09becc 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
@@ -20,6 +20,8 @@ package org.apache.johnzon.jsonb;
import org.junit.Test;
+import javax.json.Json;
+import javax.json.JsonString;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
@@ -35,20 +37,36 @@ import static org.junit.Assert.assertTrue;
public class AdapterTest {
@Test
- public void adapt() {
- final Jsonb jsonb = JsonbBuilder.create(new
JsonbConfig().withAdapters(new BarAdapter()));
- final Foo foo = new Foo();
- foo.bar = new Bar();
- foo.bar.value = 1;
- foo.dummy = new Dummy();
- foo.dummy.value = 2L;
+ public void adapt() throws Exception {
+ try (final Jsonb jsonb = JsonbBuilder.create(new
JsonbConfig().withAdapters(new BarAdapter()))) {
+ final Foo foo = new Foo();
+ foo.bar = new Bar();
+ foo.bar.value = 1;
+ foo.dummy = new Dummy();
+ foo.dummy.value = 2L;
+
+ final String toString = jsonb.toJson(foo);
+ assertEquals("{\"bar\":\"1\",\"dummy\":\"2\"}", toString);
+
+ final Foo read = jsonb.fromJson(toString, Foo.class);
+ assertEquals(foo.bar.value, read.bar.value);
+ assertEquals(foo.dummy.value, read.dummy.value);
+ }
+ }
- final String toString = jsonb.toJson(foo);
- assertEquals("{\"bar\":\"1\",\"dummy\":\"2\"}", toString);
+ @Test
+ public void adaptJson() throws Exception {
+ try (final Jsonb jsonb = JsonbBuilder.create(new
JsonbConfig().withAdapters(new Dummy2Adapter()))) {
+ final Foo2 foo = new Foo2();
+ foo.dummy = new Dummy2();
+ foo.dummy.value = 2L;
+
+ final String toString = jsonb.toJson(foo);
+ assertEquals("{\"dummy\":\"2\"}", toString);
- final Foo read = jsonb.fromJson(toString, Foo.class);
- assertEquals(foo.bar.value, read.bar.value);
- assertEquals(foo.dummy.value, read.dummy.value);
+ final Foo2 read = jsonb.fromJson(toString, Foo2.class);
+ assertEquals(foo.dummy.value, read.dummy.value);
+ }
}
@Test
@@ -115,6 +133,12 @@ public class AdapterTest {
}
+ public static class Foo2 {
+ @JsonbTypeAdapter(Dummy2Adapter.class)
+ public Dummy2 dummy;
+ }
+
+
public static class Foo {
public Bar bar;
@@ -145,10 +169,28 @@ public class AdapterTest {
}
}
+ public static class Dummy2 {
+ public long value;
+ }
+
public static class Dummy {
public long value;
}
+ public static class Dummy2Adapter implements JsonbAdapter<Dummy2,
JsonString> {
+ @Override
+ public Dummy2 adaptFromJson(final JsonString obj) {
+ final Dummy2 bar = new Dummy2();
+ bar.value = Long.parseLong(obj.getString());
+ return bar;
+ }
+
+ @Override
+ public JsonString adaptToJson(final Dummy2 obj) {
+ return Json.createValue(Long.toString(obj.value));
+ }
+ }
+
public static class DummyAdapter implements JsonbAdapter<Dummy, String> {
@Override
public Dummy adaptFromJson(final String obj) throws Exception {
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
index 1b7721e..f741aff 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
@@ -244,6 +244,9 @@ public class MappingGeneratorImpl implements
MappingGenerator {
if (type == String.class) {
generator.write(key, value.toString());
handled = true;
+ } else if (JsonValue.class.isAssignableFrom(type)) {
+ generator.write(key, JsonValue.class.cast(value));
+ handled = true;
} else if (type == long.class || type == Long.class) {
generator.write(key, Long.class.cast(value).longValue());
handled = true;
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index f8bed55..09a8a4d 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -70,9 +70,11 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static java.util.Arrays.asList;
+import static javax.json.JsonValue.ValueType.ARRAY;
import static javax.json.JsonValue.ValueType.FALSE;
import static javax.json.JsonValue.ValueType.NULL;
import static javax.json.JsonValue.ValueType.NUMBER;
+import static javax.json.JsonValue.ValueType.STRING;
import static javax.json.JsonValue.ValueType.TRUE;
/**
@@ -402,7 +404,15 @@ public class MappingParserImpl implements MappingParser {
}
private Object convertTo(final Adapter converter, final JsonValue
jsonValue, JsonPointerTracker jsonPointer) {
+ final AdapterKey key = getAdapterKey(converter);
+ if (JsonValue.class == key.getTo()) {
+ return converter.to(jsonValue);
+ }
+
if (jsonValue.getValueType() == JsonValue.ValueType.OBJECT) {
+ if (JsonObject.class == key.getTo() || JsonStructure.class ==
key.getTo()) {
+ return converter.to(jsonValue.asJsonObject());
+ }
//X TODO maybe we can put this into MapperConfig?
//X config.getAdapter(AdapterKey)
@@ -419,11 +429,16 @@ public class MappingParserImpl implements MappingParser {
return converter.to(param);
}
- final AdapterKey key = getAdapterKey(converter);
final JsonValue.ValueType valueType = jsonValue.getValueType();
if (NULL.equals(valueType)) {
return null;
}
+ if (STRING.equals(valueType)) {
+ if (key.getTo() == JsonString.class) {
+ return converter.to(JsonString.class.cast(jsonValue));
+ }
+ return converter.to(JsonString.class.cast(jsonValue).getString());
+ }
if (TRUE.equals(valueType) || FALSE.equals(valueType)) {
if (key != null) {
if (boolean.class == key.getTo() || Boolean.class ==
key.getTo()) {
@@ -445,9 +460,17 @@ public class MappingParserImpl implements MappingParser {
return
converter.to(JsonNumber.class.cast(jsonValue).bigIntegerValue());
} else if (BigDecimal.class == key.getTo()) {
return
converter.to(JsonNumber.class.cast(jsonValue).bigDecimalValue());
+ } else if (JsonNumber.class == key.getTo()) {
+ return converter.to(JsonNumber.class.cast(jsonValue));
}
}
}
+ if (ARRAY.equals(valueType)) {
+ if (JsonArray.class == key.getTo() || JsonStructure.class ==
key.getTo()) {
+ return converter.to(jsonValue.asJsonObject());
+ }
+ return buildArray(key.getTo(), jsonValue.asJsonArray(), null,
null, jsonPointer, null);
+ }
return converter.to(jsonValue.toString());
}
@@ -733,9 +756,9 @@ public class MappingParserImpl implements MappingParser {
}
try {
- return converter == null ? toObject(baseInstance, jsonValue, type,
itemConverter, jsonPointer, rootType)
- : jsonValue.getValueType() == JsonValue.ValueType.STRING ?
converter.to(JsonString.class.cast(jsonValue).getString())
- : convertTo(converter, jsonValue, jsonPointer);
+ return converter == null ?
+ toObject(baseInstance, jsonValue, type, itemConverter,
jsonPointer, rootType) :
+ convertTo(converter, jsonValue, jsonPointer);
} catch (Exception e) {
if (e instanceof MapperException) {
throw e;