id | title | sidebar_label |
---|---|---|
converter | 数据转换 | 数据转换 |
Forest支持JSON、XML、普通文本等数据转换形式。不需要接口调用者自己写具体的数据转换代码。
序列化
几乎所有数据格式的转换都包含序列化和反序列化,Forest的数据转换同样如此。
Forest中对数据进行序列化可以通过指定contentType
属性或Content-Type
头指定内容格式。
@Request(
url = "http://localhost:5000/hello/user",
type = "post",
contentType = "application/json" // 指定contentType为application/json
)
String postJson(@Body MyUser user); // 自动将user对象序列化为JSON格式
同理,指定为application/xml
会将参数序列化为XML
格式,text/plain
则为文本,默认的application/x-www-form-urlencoded
则为表格格式。
反序列化
HTTP请求响应后返回结果的数据同样需要转换,Forest则会将返回结果自动转换为您通过方法返回类型指定对象类型。这个过程就是反序列化,您可以通过dataType
指定返回数据的反序列化格式。
@Request(
url = "http://localhost:8080/data",
dataType = "json" // 指定dataType为json,将按JSON格式反序列化数据
)
Map getData(); // 请求响应的结果将被转换为Map类型对象
更换转换器
在Forest中已定义好默认的转换器,比如JSON的默认转为器为ForestFastjsonConverter
,即FastJson
的转换器。你也可以通过如下代码进行更换:
@Autowrired
private ForestConfiguration forestConfiguration;
...
// 更换JSON转换器为FastJson
forestConfiguration.setJsonConverter(new ForestFastjsonConverter());
// 更换JSON转换器为Jackson
forestConfiguration.setJsonConverter(new ForestJacksonConverter());
// 更换JSON转换器Gson
forestConfiguration.setJsonConverter(new ForestGsonConverter());
// 更换XML转换器JAXB
forestConfiguration.getConverterMap().put(ForestDataType.XML, new ForestJaxbConverter());
自定义转换器
在Forest中,每个转换类型都对应一个转换器对象,比如JSON
格式的转换器有com.dtflys.forest.converter.json.ForestFastjsonConverter
、com.dtflys.forest.converter.json.ForestGsonConverter
、com.dtflys.forest.converter.json.ForestJacksonConverter
三种,分别是基于FastJson
、Gson
、Jackson
三种不同的JSON
序列化框架。
当然,您也可以自定义自己的转换器,以适应自己项目的需要。只需三步便可完成自定义扩展转换器。
第一步. 定义一个转换器类,并实现com.dtflys.forest.converter.ForestConverter
接口
/**
* 自定义一个Protobuf的转换器,并实现ForestConverter接口下的convertToJavaObject方法
*/
public class MyProtobufConverter implements ForestConverter {
<T> T convertToJavaObject(String source, Class<T> targetType) {
// 将字符串参数source转换成目标Class对象
}
<T> T convertToJavaObject(String source, Type targetType) {
// 将字符串参数source转换成目标Type(可能是一个泛型类型)对象
}
}
第二步. 注册您定义好的转换器类到ForestConfiguration
@Autowrired
private ForestConfiguration forestConfiguration;
...
// 设置文本转换器
forestConfiguration.getConverterMap().put(ForestDataType.TEXT, new MyProtobufConverter());
// 设置二进制转换器
forestConfiguration.getConverterMap().put(ForestDataType.BINARY, new MyProtobufConverter());
// 设置二进制转换器
forestConfiguration.getConverterMap().put(ForestDataType.BINARY, new MyProtobufConverter());
JSON转换器和XML转换器比较特殊,需要 implements
的类不是 ForestConverter
/**
* JSON转换器需要实现 ForestJsonConverter 接口
*/
public class MyJsonConverter implements ForestJsonConverter {
... ...
}
/**
* XML转换器需要实现 ForestXmlConverter 接口
*/
public class MyXmlConverter implements ForestXmlConverter {
... ...
}
注册到配置中
// 设置JSON转换器
forestConfiguration.setJsonConverter(new MyJsonConverter());
// 设置XML转换器
forestConfiguration.getConverterMap().put(ForestDataType.XML, new MyXmlConverter());