@Override
    public Optional<ColumnMapper<?>> build(Type type, ConfigRegistry config) {
        ColumnMappers cm = config.get(ColumnMappers.class);
        // look for specialized json support first, revert to simple String mapping if absent
        ColumnMapper<String> jsonStringMapper = JdbiOptionals.findFirstPresent(
                () -> cm.findFor(QualifiedType.of(String.class).with(EncodedJson.class)),
                () -> cm.findFor(String.class))
                .orElseThrow(() -> new UnableToProduceResultException(JSON_NOT_RETRIEVABLE));

        final TypedJsonMapper mapper = config.get(JsonConfig.class).getJsonMapper().forType(type, config);
        return Optional.of((rs, i, ctx) ->
            mapper.fromJson(
                    Optional.ofNullable(jsonStringMapper.map(rs, i, ctx))
                            .orElse("null"), // sql null -> json null
                    config));
    }
converts a {@code (@Json) String} fetched by another mapper into a value object
json/src/main/java/org/jdbi/v3/json/internal/JsonColumnMapperFactory.java