Last active
March 1, 2024 04:14
-
-
Save nickman/991dea808b6f43e7346d6d570f3c9ffe to your computer and use it in GitHub Desktop.
Jackson JSON serializer for the DynamoDB V2 SDK's AttributeValue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
// } | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for sharing! I also had to add the following override to get it working