Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -167,26 +167,26 @@ public static Object convertSqlValue(Object value) throws SQLException {
}

if (value instanceof OracleJsonValue) {
return convertOracleJsonValue((OracleJsonValue) value);
return convertOracleJsonValue((OracleJsonValue) value, true);
}

// fallback to String
return value.toString();
}

private static Object convertOracleJsonValue(OracleJsonValue oracleJson) {
private static Object convertOracleJsonValue(OracleJsonValue oracleJson, boolean topLevel) {
if (oracleJson instanceof OracleJsonObject) {
OracleJsonObject obj = (OracleJsonObject) oracleJson;
Map<String, Object> map = new LinkedHashMap<>(obj.size());
for (Map.Entry<String, OracleJsonValue> entry : obj.entrySet()) {
map.put(entry.getKey(), convertOracleJsonValue(entry.getValue()));
map.put(entry.getKey(), convertOracleJsonValue(entry.getValue(), false));
}
return new JsonObject(map);
} else if (oracleJson instanceof OracleJsonArray) {
OracleJsonArray arr = (OracleJsonArray) oracleJson;
List<Object> list = new ArrayList<>(arr.size());
for (OracleJsonValue element : arr) {
list.add(convertOracleJsonValue(element));
list.add(convertOracleJsonValue(element, false));
}
return new JsonArray(list);
} else if (oracleJson instanceof OracleJsonString) {
Expand All @@ -204,7 +204,7 @@ private static Object convertOracleJsonValue(OracleJsonValue oracleJson) {
case FALSE:
return Boolean.FALSE;
case NULL:
return Tuple.JSON_NULL;
return topLevel ? Tuple.JSON_NULL : null;
default:
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,4 +301,31 @@ public void testInsertJsonBooleanWithSqlWorkaround(TestContext ctx) {
ctx.assertEquals(Boolean.TRUE, rows.iterator().next().getJson(0));
}));
}

@Test
public void testDecodeNestedJsonNull(TestContext ctx) {
JsonObject expected = new JsonObject().put("key", (String) null);
pool.preparedQuery("INSERT INTO json_test (id, data) VALUES (?, ?)")
.execute(Tuple.of(50, expected))
.compose(v -> pool.preparedQuery("SELECT data FROM json_test WHERE id = ?").execute(Tuple.of(50)))
.onComplete(ctx.asyncAssertSuccess(rows -> {
ctx.assertEquals(1, rows.size());
Row row = rows.iterator().next();
JsonObject result = row.getJsonObject(0);
ctx.assertTrue(result.containsKey("key"));
ctx.assertNull(result.getValue("key"));
}));
}

@Test
public void testDecodeTopLevelJsonNull(TestContext ctx) {
pool.preparedQuery("INSERT INTO json_test (id, data) VALUES (?, ?)")
.execute(Tuple.of(51, Tuple.JSON_NULL))
.compose(v -> pool.preparedQuery("SELECT data FROM json_test WHERE id = ?").execute(Tuple.of(51)))
.onComplete(ctx.asyncAssertSuccess(rows -> {
ctx.assertEquals(1, rows.size());
Row row = rows.iterator().next();
ctx.assertEquals(Tuple.JSON_NULL, row.getJson(0));
}));
}
}
Loading