idtitlesidebar_label
converter
数据转换
数据转换

Forest支持JSON、XML、普通文本等数据转换形式。不需要接口调用者自己写具体的数据转换代码。

序列化

几乎所有数据格式的转换都包含序列化和反序列化,Forest的数据转换同样如此。

Forest中对数据进行序列化可以通过指定contentType属性或Content-Type头指定内容格式。

  1. @Request(
  2. url = "http://localhost:5000/hello/user",
  3. type = "post",
  4. contentType = "application/json" // 指定contentType为application/json
  5. )
  6. String postJson(@Body MyUser user); // 自动将user对象序列化为JSON格式

同理,指定为application/xml会将参数序列化为XML格式,text/plain则为文本,默认的application/x-www-form-urlencoded则为表格格式。

反序列化

HTTP请求响应后返回结果的数据同样需要转换,Forest则会将返回结果自动转换为您通过方法返回类型指定对象类型。这个过程就是反序列化,您可以通过dataType指定返回数据的反序列化格式。

  1. @Request(
  2. url = "http://localhost:8080/data",
  3. dataType = "json" // 指定dataType为json,将按JSON格式反序列化数据
  4. )
  5. Map getData(); // 请求响应的结果将被转换为Map类型对象

更换转换器

在Forest中已定义好默认的转换器,比如JSON的默认转为器为ForestFastjsonConverter,即FastJson的转换器。你也可以通过如下代码进行更换:

  1. @Autowrired
  2. private ForestConfiguration forestConfiguration;
  3. ...
  4. // 更换JSON转换器为FastJson
  5. forestConfiguration.setJsonConverter(new ForestFastjsonConverter());
  6. // 更换JSON转换器为Jackson
  7. forestConfiguration.setJsonConverter(new ForestJacksonConverter());
  8. // 更换JSON转换器Gson
  9. forestConfiguration.setJsonConverter(new ForestGsonConverter());
  10. // 更换XML转换器JAXB
  11. forestConfiguration.getConverterMap().put(ForestDataType.XML, new ForestJaxbConverter());

自定义转换器

在Forest中,每个转换类型都对应一个转换器对象,比如JSON格式的转换器有com.dtflys.forest.converter.json.ForestFastjsonConvertercom.dtflys.forest.converter.json.ForestGsonConvertercom.dtflys.forest.converter.json.ForestJacksonConverter三种,分别是基于FastJsonGsonJackson三种不同的JSON序列化框架。

当然,您也可以自定义自己的转换器,以适应自己项目的需要。只需三步便可完成自定义扩展转换器。

第一步. 定义一个转换器类,并实现com.dtflys.forest.converter.ForestConverter接口

  1. /**
  2. * 自定义一个Protobuf的转换器,并实现ForestConverter接口下的convertToJavaObject方法
  3. */
  4. public class MyProtobufConverter implements ForestConverter {
  5. <T> T convertToJavaObject(String source, Class<T> targetType) {
  6. // 将字符串参数source转换成目标Class对象
  7. }
  8. <T> T convertToJavaObject(String source, Type targetType) {
  9. // 将字符串参数source转换成目标Type(可能是一个泛型类型)对象
  10. }
  11. }

第二步. 注册您定义好的转换器类到ForestConfiguration

  1. @Autowrired
  2. private ForestConfiguration forestConfiguration;
  3. ...
  4. // 设置文本转换器
  5. forestConfiguration.getConverterMap().put(ForestDataType.TEXT, new MyProtobufConverter());
  6. // 设置二进制转换器
  7. forestConfiguration.getConverterMap().put(ForestDataType.BINARY, new MyProtobufConverter());
  8. // 设置二进制转换器
  9. forestConfiguration.getConverterMap().put(ForestDataType.BINARY, new MyProtobufConverter());

JSON转换器和XML转换器比较特殊,需要 implements 的类不是 ForestConverter

  1. /**
  2. * JSON转换器需要实现 ForestJsonConverter 接口
  3. */
  4. public class MyJsonConverter implements ForestJsonConverter {
  5. ... ...
  6. }
  7. /**
  8. * XML转换器需要实现 ForestXmlConverter 接口
  9. */
  10. public class MyXmlConverter implements ForestXmlConverter {
  11. ... ...
  12. }

注册到配置中

  1. // 设置JSON转换器
  2. forestConfiguration.setJsonConverter(new MyJsonConverter());
  3. // 设置XML转换器
  4. forestConfiguration.getConverterMap().put(ForestDataType.XML, new MyXmlConverter());