Skip to content

Instantly share code, notes, and snippets.

@nickman
Last active March 1, 2024 04:14
Show Gist options
  • Save nickman/991dea808b6f43e7346d6d570f3c9ffe to your computer and use it in GitHub Desktop.
Save nickman/991dea808b6f43e7346d6d570f3c9ffe to your computer and use it in GitHub Desktop.
Jackson JSON serializer for the DynamoDB V2 SDK's AttributeValue
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList;
import software.amazon.awssdk.core.util.DefaultSdkAutoConstructMap;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
/**
* <p>Title: AttributeValueSerializer</p>
* <p>Description: Jackson JSON serializer for the DynamoDB V2 SDK's {@link software.amazon.awssdk.services.dynamodb.model.AttributeValue}</p>
* <p>Author: Whitehead</p>
*/
public class AttributeValueSerializer extends JsonSerializer<AttributeValue> {
public static final DefaultSdkAutoConstructMap<?,?> EMPTY_ATTR_MAP = DefaultSdkAutoConstructMap.getInstance();
public static final DefaultSdkAutoConstructList<?> EMPTY_ATTR_LIST = DefaultSdkAutoConstructList.getInstance();
public static final JsonSerializer<AttributeValue> INSTANCE = new AttributeValueSerializer();
private AttributeValueSerializer() {
}
@Override
public void serialize(AttributeValue av, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (av == null) {
gen.writeNull();
} else {
if (av.m() != EMPTY_ATTR_MAP) {
gen.writeStartObject();
Map<String, AttributeValue> map = av.m();
for(Map.Entry<String, AttributeValue> entry : map.entrySet()) {
gen.writeFieldName(entry.getKey());
serialize(entry.getValue(), gen, serializers);
}
gen.writeEndObject();
} else if (av.l() != EMPTY_ATTR_LIST) {
List<AttributeValue> list = av.l();
gen.writeStartArray();
for(AttributeValue a : list) {
serialize(a, gen, serializers);
}
gen.writeEndArray();
} else if (av.s() != null) {
gen.writeString(av.s());
} else if (av.n() != null) {
gen.writeNumber(new BigDecimal(av.n()));
} else if (av.bool() != null) {
gen.writeBoolean(av.bool());
} else if (av.nul() != null && av.nul()) {
gen.writeNull();
} else if (av.b() != null) {
gen.writeBinary(av.b().asByteArray());
} else if (av.ss() != EMPTY_ATTR_LIST) {
List<String> list = av.ss();
int size = list.size();
gen.writeStartArray(size);
for(int i = 0; i < size; i++) {
gen.writeString(list.get(i));
}
gen.writeEndArray();
} else if (av.bs() != EMPTY_ATTR_LIST) {
List<SdkBytes> list = av.bs();
int size = list.size();
gen.writeStartArray(size);
for(int i = 0; i < size; i++) {
gen.writeBinary(list.get(i).asByteArray());
}
gen.writeEndArray();
} else if (av.ns() != EMPTY_ATTR_LIST) {
List<String> list = av.ns();
int size = list.size();
gen.writeStartArray(size);
for(int i = 0; i < size; i++) {
gen.writeNumber(new BigDecimal(list.get(i)));
}
gen.writeEndArray();
} else if (av.nul() != null) {
gen.writeNull();
}
// else {
// System.err.println("MISSED DATA TYPE: " + av);
// }
}
}
}
@0bx
Copy link

0bx commented Mar 27, 2021

Thanks for sharing! I also had to add the following override to get it working

   @Override
    public Class<AttributeValue> handledType() {
        return AttributeValue.class;
    }

@nickman
Copy link
Author

nickman commented Mar 27, 2021

Thanks !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment