Skip to content

Commit

Permalink
[json-core] Add SimpleMapper API to core to make it easier for readin…
Browse files Browse the repository at this point in the history
…g/writing simple Maps, Lists etc
  • Loading branch information
rbygrave committed Dec 12, 2024
1 parent cc526c1 commit a4f7568
Show file tree
Hide file tree
Showing 9 changed files with 465 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import java.util.List;
import java.util.Map;

final class BasicObjectAdapter implements JsonAdapter<Object> {
final class BasicObjectAdapter implements JsonAdapter<Object>, CoreTypes.CoreAdapters {

private final JsonAdapter<String> stringAdapter;
private final JsonAdapter<Double> doubleAdapter;
Expand All @@ -27,6 +27,21 @@ final class BasicObjectAdapter implements JsonAdapter<Object> {
this.mapAdapter = CoreTypes.createMap(this);
}

@Override
public JsonAdapter<Object> objectAdapter() {
return this;
}

@Override
public JsonAdapter<List<Object>> listAdapter() {
return listAdapter;
}

@Override
public JsonAdapter<Map<String, Object>> mapAdapter() {
return mapAdapter;
}

@Override
public Object fromJson(JsonReader reader) {
switch (reader.currentToken()) {
Expand Down
23 changes: 22 additions & 1 deletion json-core/src/main/java/io/avaje/json/core/CoreTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ public static <V> JsonAdapter<Set<V>> createSet(JsonAdapter<V> elementAdapter) {
* types of: String, Integer, Long, Double, Boolean plus List and Map
* of those types.
*/
public static JsonAdapter<Object> createBasicObject() {
public static CoreAdapters createCoreAdapters() {
return new BasicObjectAdapter();
}

Expand All @@ -122,4 +122,25 @@ public Void fromJson(JsonReader reader) {
throw new UnsupportedOperationException();
}
}

/**
* The basic JsonAdapter types.
*/
public interface CoreAdapters {

/**
* Return the Object JsonAdapter.
*/
JsonAdapter<Object> objectAdapter();

/**
* Return the List JsonAdapter.
*/
JsonAdapter<List<Object>> listAdapter();

/**
* Return the Map JsonAdapter.
*/
JsonAdapter<Map<String, Object>> mapAdapter();
}
}
55 changes: 55 additions & 0 deletions json-core/src/main/java/io/avaje/json/simple/DSimpleMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package io.avaje.json.simple;

import io.avaje.json.core.CoreTypes;
import io.avaje.json.stream.JsonStream;

import java.util.List;
import java.util.Map;

final class DSimpleMapper implements SimpleMapper {

private final Type<Object> objectType;
private final Type<Map<String,Object>> mapType;
private final Type<List<Object>> listType;

DSimpleMapper(JsonStream jsonStream, CoreTypes.CoreAdapters adapters) {
this.objectType = new DTypeMapper<>(adapters.objectAdapter(), jsonStream);
this.mapType = new DTypeMapper<>(adapters.mapAdapter(), jsonStream);
this.listType = new DTypeMapper<>(adapters.listAdapter(), jsonStream);
}

@Override
public Type<Object> object() {
return objectType;
}

@Override
public Type<Map<String, Object>> map() {
return mapType;
}

@Override
public Type<List<Object>> list() {
return listType;
}

@Override
public String toJson(Object object) {
return objectType.toJson(object);
}

@Override
public Object fromJson(String json) {
return objectType.fromJson(json);
}

@Override
public Map<String,Object> fromJsonObject(String json) {
return mapType.fromJson(json);
}

@Override
public List<Object> fromJsonArray(String json) {
return listType.fromJson(json);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.avaje.json.simple;

import io.avaje.json.core.CoreTypes;
import io.avaje.json.stream.JsonStream;

final class DSimpleMapperBuilder implements SimpleMapper.Builder {

private JsonStream jsonStream;

@Override
public SimpleMapper.Builder jsonStream(JsonStream jsonStream) {
this.jsonStream = jsonStream;
return this;
}

@Override
public SimpleMapper build() {
final var stream = jsonStream != null ? jsonStream : JsonStream.builder().build();
final var coreAdapters = CoreTypes.createCoreAdapters();
return new DSimpleMapper(stream, coreAdapters);
}
}
114 changes: 114 additions & 0 deletions json-core/src/main/java/io/avaje/json/simple/DTypeMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package io.avaje.json.simple;

import io.avaje.json.JsonAdapter;
import io.avaje.json.JsonException;
import io.avaje.json.JsonReader;
import io.avaje.json.JsonWriter;
import io.avaje.json.stream.BufferedJsonWriter;
import io.avaje.json.stream.BytesJsonWriter;
import io.avaje.json.stream.JsonStream;

import java.io.*;

final class DTypeMapper<T> implements SimpleMapper.Type<T> {

private final JsonAdapter<T> adapter;
private final JsonStream jsonStream;

DTypeMapper(JsonAdapter<T> adapter, JsonStream jsonStream) {
this.adapter = adapter;
this.jsonStream = jsonStream;
}

@Override
public T fromJson(JsonReader reader) {
return adapter.fromJson(reader);
}

@Override
public T fromJson(String content) {
try (JsonReader reader = jsonStream.reader(content)) {
return adapter.fromJson(reader);
}
}

@Override
public T fromJson(byte[] content) {
try (JsonReader reader = jsonStream.reader(content)) {
return adapter.fromJson(reader);
}
}

@Override
public T fromJson(Reader content) {
try (JsonReader reader = jsonStream.reader(content)) {
return adapter.fromJson(reader);
}
}

@Override
public T fromJson(InputStream content) {
try (JsonReader reader = jsonStream.reader(content)) {
return adapter.fromJson(reader);
}
}

@Override
public String toJson(T value) {
try (BufferedJsonWriter writer = jsonStream.bufferedWriter()) {
toJson(value, writer);
return writer.result();
}
}

@Override
public String toJsonPretty(T value) {
try (BufferedJsonWriter writer = jsonStream.bufferedWriter()) {
writer.pretty(true);
toJson(value, writer);
return writer.result();
}
}

@Override
public byte[] toJsonBytes(T value) {
try (BytesJsonWriter writer = jsonStream.bufferedWriterAsBytes()) {
toJson(value, writer);
return writer.result();
}
}

@Override
public void toJson(T value, JsonWriter writer) {
try {
adapter.toJson(writer, value);
} catch (RuntimeException e) {
writer.markIncomplete();
throw new JsonException(e);
}
}

@Override
public void toJson(T value, Writer writer) {
try (JsonWriter jsonWriter = jsonStream.writer(writer)) {
toJson(value, jsonWriter);
}
}

@Override
public void toJson(T value, OutputStream outputStream) {
try (JsonWriter writer = jsonStream.writer(outputStream)) {
toJson(value, writer);
}
close(outputStream);
}

private void close(Closeable outputStream) {
try {
outputStream.close();
} catch (IOException e) {
throw new UncheckedIOException("Error closing stream", e);
}
}

}
Loading

0 comments on commit a4f7568

Please sign in to comment.