You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中生成含contentEncoding:base64的StringSchema技术求助

解决Jackson JsonSchemaGenerator生成带contentEncoding/contentMediaType的StringSchema问题

针对你遇到的Jackson JsonSchema库无法直接生成包含contentEncoding和contentMediaType关键字的StringSchema问题,给你几个可行的方案:

方案1:手动为StringSchema添加自定义属性

Jackson的StringSchema类虽然没有直接暴露contentEncoding和contentMediaType的setter,但可以通过其**额外属性(extra properties)**机制添加这两个关键字,代码示例:

import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

public class SchemaBuilder {
    public static JsonSchema buildImageSchema() {
        StringSchema stringSchema = new StringSchema();
        // 添加contentEncoding和contentMediaType到额外属性
        stringSchema.addExtraProperty("contentEncoding", "base64");
        stringSchema.addExtraProperty("contentMediaType", "image/png");
        return stringSchema;
    }
}

生成后的Schema会包含你需要的两个关键字,完全符合JSON Schema规范。

方案2:自定义Schema生成器扩展

如果你需要通过JsonSchemaGenerator自动生成这类Schema(比如针对特定Java类型),可以自定义类型的Schema生成逻辑:

  1. 继承StringSchemaFactory,重写generateSchema方法,在生成的StringSchema中添加目标属性:
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;
import com.fasterxml.jackson.module.jsonSchema.factories.StringSchemaFactory;

public class BinaryStringSchemaFactory extends StringSchemaFactory {
    @Override
    public JsonSchema generateSchema(JavaType type, SchemaFactoryWrapper context) {
        StringSchema schema = (StringSchema) super.generateSchema(type, context);
        // 根据类型判断是否添加属性,这里以处理byte[]类型为例
        if (type.getRawClass().equals(byte[].class)) {
            schema.addExtraProperty("contentEncoding", "base64");
            schema.addExtraProperty("contentMediaType", "image/png");
        }
        return schema;
    }
}
  1. 将自定义Factory注册到JsonSchemaGenerator:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;

public class CustomSchemaGenerator {
    public static JsonSchema generateSchemaForType(Class<?> clazz) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper);
        // 替换默认的StringSchemaFactory为自定义实现
        SchemaFactoryWrapper wrapper = new SchemaFactoryWrapper();
        wrapper.setSchemaFactory(new BinaryStringSchemaFactory());
        return generator.generateSchema(clazz, wrapper);
    }
}

这样当你为byte[]类型生成Schema时,会自动带上这两个关键字。

方案3:直接构建JSON节点再转换为JsonSchema

如果上述方法都不适用,还可以直接用Jackson的ObjectNode构建符合要求的JSON结构,再转换为JsonSchema:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;

public class DirectSchemaBuilder {
    public static JsonSchema buildImageSchema() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode schemaNode = mapper.createObjectNode();
        schemaNode.put("type", "string");
        schemaNode.put("contentEncoding", "base64");
        schemaNode.put("contentMediaType", "image/png");
        return mapper.treeToValue(schemaNode, JsonSchema.class);
    }
}

这种方式最灵活,完全自定义Schema结构,不受Jackson JsonSchema类的属性限制。

内容的提问来源于stack exchange,提问作者Leo Z.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:54:23