Skip to content
Open
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
11 changes: 11 additions & 0 deletions transact/src/main/java/dev/dbos/transact/json/JSONSerde.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.dbos.transact.json;

public interface JSONSerde {
String serializeArray(Object[] args);

Object[] deserializeToArray(String json);

String toJson(Object obj);

<T> T fromJson(String content, Class<T> valueType);
}
46 changes: 14 additions & 32 deletions transact/src/main/java/dev/dbos/transact/json/JSONUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,24 @@
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JSONUtil {
private static final Logger logger = LoggerFactory.getLogger(Conductor.class);

private static final ObjectMapper mapper = new ObjectMapper();
private static JSONSerde jsonSerde = new JacksonJSONSerde();

public static JSONSerde getJsonSerde() {
return jsonSerde;
}

public static void setJsonSerde(JSONSerde jsonSerde) {
JSONUtil.jsonSerde = jsonSerde;
}

public static class JsonRuntimeException extends RuntimeException {
public JsonRuntimeException(JsonProcessingException cause) {
public JsonRuntimeException(Exception cause) {
super(cause.getMessage(), cause);
setStackTrace(cause.getStackTrace());
for (Throwable suppressed : cause.getSuppressed()) {
Expand All @@ -36,30 +40,16 @@ public JsonRuntimeException(JsonProcessingException cause) {
}
}

static {
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // Optional
}

public static String serialize(Object obj) {
return serializeArray(new Object[] {obj});
}

public static String serializeArray(Object[] args) {
try {
return mapper.writeValueAsString(new Boxed(args));
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
return jsonSerde.serializeArray(args);
}

public static Object[] deserializeToArray(String json) {
try {
Boxed boxed = mapper.readValue(json, Boxed.class);
return boxed.args;
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
return jsonSerde.deserializeToArray(json);
}

public static String serializeAppException(Throwable error) {
Expand All @@ -83,19 +73,11 @@ public static Throwable deserializeAppException(String str) {
}

public static String toJson(Object obj) {
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
return jsonSerde.toJson(obj);
}

public static <T> T fromJson(String content, Class<T> valueType) {
try {
return mapper.readValue(content, valueType);
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
return jsonSerde.fromJson(content, valueType);
}

public static final class WireThrowable {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package dev.dbos.transact.json;

import dev.dbos.transact.json.JSONUtil.JsonRuntimeException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

public class JacksonJSONSerde implements JSONSerde {
private final ObjectMapper mapper = new ObjectMapper();

{
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // Optional
}

public String serializeArray(Object[] args) {
try {
return mapper.writeValueAsString(new Boxed(args));
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
}

public Object[] deserializeToArray(String json) {
try {
Boxed boxed = mapper.readValue(json, Boxed.class);
return boxed.args;
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
}

public String toJson(Object obj) {
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
}

public <T> T fromJson(String content, Class<T> valueType) {
try {
return mapper.readValue(content, valueType);
} catch (JsonProcessingException e) {
throw new JsonRuntimeException(e);
}
}
}