use of io.micronaut.serde.Deserializer in project micronaut-serialization by micronaut-projects.
the class JacksonJsonMapper method readValue0.
@SuppressWarnings({ "rawtypes", "unchecked" })
private <T> T readValue0(JsonParser parser, Argument<?> type) throws IOException {
parser.setCodec(objectCodecImpl);
Deserializer deserializer = registry.findDeserializer(type).createSpecific(decoderContext, (Argument) type);
if (!parser.hasCurrentToken()) {
parser.nextToken();
}
// for jackson compat we need to support deserializing null, but most deserializers don't support it.
if (parser.currentToken() == JsonToken.VALUE_NULL && !deserializer.allowNull()) {
return null;
}
final Decoder decoder = JacksonDecoder.create(parser, view);
return (T) deserializer.deserialize(decoder, decoderContext, type);
}
use of io.micronaut.serde.Deserializer in project micronaut-serialization by micronaut-projects.
the class DefaultSerdeRegistry method findDeserializer.
@Override
public <T> Deserializer<? extends T> findDeserializer(Argument<? extends T> type) {
Objects.requireNonNull(type, "Type cannot be null");
final TypeKey key = new TypeKey(type);
final Deserializer<?> deserializer = deserializerMap.get(key);
if (deserializer != null) {
return (Deserializer<? extends T>) deserializer;
} else {
final Argument<Deserializer> deserializerArgument = Argument.of(Deserializer.class, type);
final Collection<BeanRegistration<Deserializer>> beanRegistrations = beanContext.getBeanRegistrations(deserializerArgument, null);
Deserializer<?> deser = null;
if (beanRegistrations.size() == 1) {
deser = beanRegistrations.iterator().next().bean();
} else if (!beanRegistrations.isEmpty()) {
final List<BeanRegistration<Deserializer>> results = beanRegistrations.stream().filter((r) -> {
final Class<?>[] typeParameters = r.getBeanDefinition().getTypeParameters(Deserializer.class);
return typeParameters.length == 1 && typeParameters[0].equals(type.getType());
}).collect(Collectors.toList());
if (results.size() == 1) {
deser = results.iterator().next().bean();
} else {
deser = beanContext.findBean(deserializerArgument).orElse(null);
}
}
if (deser != null) {
deserializerMap.put(key, deser);
return (Deserializer<? extends T>) deser;
}
}
if (key.getType().isArray()) {
deserializerMap.put(key, objectArraySerde);
return (Deserializer<? extends T>) objectArraySerde;
} else {
deserializerMap.put(key, objectDeserializer);
return (Deserializer<? extends T>) objectDeserializer;
}
}
use of io.micronaut.serde.Deserializer in project micronaut-data by micronaut-projects.
the class DataDecoderContext method findCustomDeserializer.
@Override
public <T, D extends Deserializer<? extends T>> D findCustomDeserializer(Class<? extends D> deserializerClass) throws SerdeException {
if (deserializerClass == OneRelationDeserializer.class) {
OneRelationDeserializer oneRelationDeserializer = new OneRelationDeserializer() {
@Override
public Deserializer<Object> createSpecific(DecoderContext decoderContext, Argument<? super Object> type) throws SerdeException {
Deserializer<?> relationDeser = findDeserializer(type);
return new Deserializer<Object>() {
@Override
public Object deserialize(Decoder decoder, DecoderContext decoderContext, Argument<? super Object> type) throws IOException {
if (decoder.decodeNull()) {
return null;
}
CodecBsonDecoder<BsonDocument> codecBsonDecoder = new CodecBsonDecoder<>(new BsonDocumentCodec(codecRegistry));
BsonDocument document = codecBsonDecoder.deserialize(decoder, decoderContext, type);
if (document == null || document.size() <= 1) {
return null;
}
return relationDeser.deserialize(new BsonReaderDecoder(document.asBsonReader()), decoderContext, type);
}
};
}
@Override
public Object deserialize(Decoder decoder, DecoderContext decoderContext, Argument<? super Object> type) throws IOException {
throw new IllegalStateException("Create specific call is required!");
}
};
return (D) oneRelationDeserializer;
}
if (deserializerClass == IdDeserializer.class) {
IdDeserializer idDeserializer = new IdDeserializer() {
@Override
public Deserializer<Object> createSpecific(DecoderContext decoderContext, Argument<? super Object> type) throws SerdeException {
if (type.getType().isAssignableFrom(String.class) && type.isAnnotationPresent(GeneratedValue.class)) {
Deserializer<? extends ObjectId> deserializer = findDeserializer(OBJECT_ID);
return (decoder, decoderContext2, objectIdType) -> {
ObjectId objectId = deserializer.deserialize(decoder, decoderContext2, OBJECT_ID);
return objectId == null ? null : objectId.toHexString();
};
}
return (Deserializer<Object>) findDeserializer(type);
}
@Override
public Object deserialize(Decoder decoder, DecoderContext decoderContext, Argument<? super Object> type) throws IOException {
throw new IllegalStateException("Create specific call is required!");
}
};
return (D) idDeserializer;
}
if (deserializerClass == CustomConverterDeserializer.class) {
CustomConverterDeserializer customConverterDeserializer = new CustomConverterDeserializer() {
@Override
public Deserializer<Object> createSpecific(DecoderContext decoderContext, Argument<? super Object> type) throws SerdeException {
Class<?> converterClass = type.getAnnotationMetadata().classValue(MappedProperty.class, "converter").orElseThrow(IllegalStateException::new);
Class<Object> converterPersistedType = type.getAnnotationMetadata().classValue(MappedProperty.class, "converterPersistedType").orElseThrow(IllegalStateException::new);
Argument<Object> convertedType = Argument.of(converterPersistedType);
AttributeConverter<Object, Object> converter = attributeConverterRegistry.getConverter(converterClass);
Deserializer<?> deserializer = findDeserializer(convertedType);
return new Deserializer<Object>() {
@Override
public Object deserialize(Decoder decoder, DecoderContext decoderContext, Argument<? super Object> type) throws IOException {
if (decoder.decodeNull()) {
return null;
}
Object deserialized = deserializer.deserialize(decoder, decoderContext, convertedType);
return converter.convertToEntityValue(deserialized, ConversionContext.of(convertedType));
}
};
}
@Override
public Object deserialize(Decoder decoder, DecoderContext decoderContext, Argument<? super Object> type) throws IOException {
throw new IllegalStateException("Create specific call is required!");
}
};
return (D) customConverterDeserializer;
}
return parent.findCustomDeserializer(deserializerClass);
}
use of io.micronaut.serde.Deserializer in project micronaut-serialization by micronaut-projects.
the class JacksonJsonMapper method updateValueFromTree.
@Override
public void updateValueFromTree(Object value, JsonNode tree) throws IOException {
if (tree != null && value != null) {
Argument<Object> type = (Argument<Object>) Argument.of(value.getClass());
Deserializer deserializer = registry.findDeserializer(type).createSpecific(decoderContext, type);
if (deserializer instanceof UpdatingDeserializer) {
try (JsonParser parser = treeCodec.treeAsTokens(tree)) {
parser.setCodec(objectCodecImpl);
if (!parser.hasCurrentToken()) {
parser.nextToken();
}
// for jackson compat we need to support deserializing null, but most deserializers don't support it.
if (parser.currentToken() != JsonToken.VALUE_NULL) {
final Decoder decoder = JacksonDecoder.create(parser, view);
((UpdatingDeserializer<Object>) deserializer).deserializeInto(decoder, decoderContext, type, value);
}
}
}
}
}
Aggregations