如何在Retrofit库中将YAML响应体解析为POJO对象
Retrofit处理YAML格式响应的解决方案
方案一:基于Jackson YAML封装自定义转换器(最简便)
该方案复用Jackson成熟的序列化/反序列化能力,仅需少量代码即可完成转换器开发:
- 首先导入相关依赖,需同时引入Jackson的YAML处理模块和Retrofit核心依赖:
// jackson yaml核心依赖 implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2' implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2' - 实现自定义
Converter.Factory,代码示例如下:public class YamlConverterFactory extends Converter.Factory { private final ObjectMapper yamlMapper = new YAMLMapper(); public static YamlConverterFactory create() { return new YamlConverterFactory(); } // 响应体转换器:将YAML格式响应转成实体类 @Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { JavaType javaType = yamlMapper.getTypeFactory().constructType(type); return value -> { try (InputStream inputStream = value.byteStream()) { return yamlMapper.readValue(inputStream, javaType); } }; } // 如需提交YAML格式的请求体,补充以下方法 @Override public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { JavaType javaType = yamlMapper.getTypeFactory().constructType(type); return (Converter<Object, RequestBody>) value -> RequestBody.create( yamlMapper.writeValueAsBytes(value), MediaType.get("application/x-yaml") ); } } - 构建Retrofit实例时注册转换器即可生效:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的接口根地址") .addConverterFactory(YamlConverterFactory.create()) .build();
方案二:基于其他YAML库自定义转换器
如果你偏好使用SnakeYAML等其他YAML处理库,替换上述代码中Jackson相关的序列化/反序列化逻辑即可,核心实现逻辑不变:
- 实现
Converter<ResponseBody, T>接口完成响应体YAML转实体类的逻辑 - 实现
Converter<T, RequestBody>接口完成实体类转YAML请求体的逻辑 - 继承
Converter.Factory封装上述两个转换器的生成逻辑
临时调试或者项目中YAML格式响应占比极低的场景,也可以先用scalars转换器把YAML响应以字符串格式拿到,再在业务层自行调用YAML解析库做转换,不需要额外封装转换器。
内容的提问来源于stack exchange,提问作者Mateusz Łuczak
相关产品推荐
相关产品推荐

