当前位置: 首页 > news >正文

定制型网站制作价格单页网站制作

定制型网站制作价格,单页网站制作,免费制作海报的app,从事网站建设的职业一、问题背景 Jackson框架对json字段的序列化和反序列化默认策略是根据getter和setter方法,去掉get和set,再把首字母小写,便找到了对应的字段。通常情况,我们都是对普通的POJO进行serialization/deserialization。那么如果遇到了解析抽象类(…

一、问题背景

Jackson框架对json字段的序列化和反序列化默认策略是根据getter和setter方法,去掉get和set,再把首字母小写,便找到了对应的字段。通常情况,我们都是对普通的POJO进行serialization/deserialization。那么如果遇到了解析抽象类(或者接口)呢?如何定位到对应的实现类?实现类都找不到,谈何匹配到对应的字段反序列化。

二、JsonTypeInfo 注解简单介绍

作用于类或接口,被用来处理多态类型的序列化及反序列化。

This is necessarily for polymorphic types, and may also be needed to link abstract declared types and matching concrete implementation.

三、demo

先写个小demo对这个功能有个初步的感性认识。

1.抽象类

package jackson;import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import lombok.Data;@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true)
@JsonSubTypes({@JsonSubTypes.Type(value = InputPageModel.class, name = "input"), @JsonSubTypes.Type(value = NumberPageModel.class, name = "number")})
public abstract class Page {private String type;private String name;private String uiType;private String label;
}

注解里的visible字段:如果为false,那么反序列化时,类型id字段(在这个demo里是type字段)的值将不会被反序列化到POJO中。

2.1 实现类1

package jackson;import lombok.Data;@Data
public class InputPage extends Page {private String input;
}

2.2 实现类2

package jackson;import lombok.Data;@Data
public class NumberPage extends Page {private Integer number;
}

3.测试类

package jackson;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;import java.io.IOException;public class JsonTypeInfoTest {public static void main(String[] args) {String inputJson = " {\n" +"        \"type\": \"input\",\n" +"        \"label\": \"标题\",\n" +"        \"uiType\": \"input\",\n" +"        \"input\" : \"lvsheng\"\n" +"        \n" +"      }";ObjectMapper mapper = new ObjectMapper();try {InputPage inputPageModel = ((InputPage) mapper.readValue(inputJson, Page.class));System.out.println(inputPageModel.getInput());} catch (IOException e) {e.printStackTrace();}String numberJson = " {\n" +"        \"type\": \"number\",\n" +"        \"label\": \"价格\",\n" +"        \"uiType\": \"input\",\n" +"        \"number\" : 110\n" +"        \n" +"      }";try {NumberPage numberPageModel = ((NumberPage) mapper.readValue(numberJson, Page.class));System.out.println(numberPageModel.getNumber());} catch (IOException e) {e.printStackTrace();}}
}

测试类输出

lvsheng
110

四、 在大型工程里的应用

这个demo里JsonTypeInfo借助JsonSubTypes注解来感知抽象类的有哪些实现类,并且是如何匹配的。在大型工程中抽象类的子类很多(接口的实现很多),那么JsonSubTypes注解就十分臃肿了。而且这种写法是 违反开闭原则(OCP) 的。借助以下方式可以将JsonSubTypes剔除掉,达到相同的效果。

1. 给子类加JsonTypeName注解

package jackson;import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.Data;@Data
@JsonTypeName(value = "input")
public class InputPage extends Page {private String input;
}

2. 借助reflections框架,将所有JsonTypeName注解类扫描出来

ObjectMapper并不具备扫描实现JsonTypeName注解的类,因此需要自己手工扫描所有带有这个注解的类。reflections框架在我的另一篇博客 Reflections框架,类扫描神器 里有介绍。

Set<Class<?>> classSet = reflections.getTypesAnnotatedWith(JsonTypeName.class);

3. 手工将扫出来的类注册到ObjectMapper对象

最后一步,完成子类注册

ObjectMapper  mapper   = new ObjectMapper();
classSet.parallelStream().forEach(clazz -> mapper.registerSubtypes(clazz));

这样便可以在大型工程里优雅的使用jackson解析多态类,每增加一个子类型,无需修改额外的代码。对扩展开放,对修改封闭。

五、其他主流json框架对多态的支持

框架是否支持备注
gson支持不支持注解,使用不方便 官方demo
fastjson不支持
json-lib不支持

当遇到json框架技术选型时,如果有处理多态的需求,那么jackson无疑是最佳的选择。


附录

jackson github 主页地址 https://github.com/FasterXML/jackson

http://www.wooajung.com/news/33747.html

相关文章:

  • 十大创意网站怎么让网站被百度收录
  • 养生网站建设免费搜索引擎优化结果
  • 几十万做网站平台今天特大军事新闻
  • 网站开发能作为无形资产吗网络营销推广有效方式
  • 全国中高风险地区站长工具seo综合查询源码
  • 深圳骏域网站建设专家网站排名优化客服
  • 网站建设seo运营规划软文广告文案
  • 家装公司网站建设百度推广方法
  • 网站建设收费标准方案免费b站推广网站2023
  • 公司建设门户网站的意义搜索引擎优化seo优惠
  • 网站建设的开多少税率东莞企业网站设计公司
  • 汽车租赁网站怎么做网络营销推广专员
  • 科技备案企业网站线上推广方案
  • 东莞网站推广渠道有哪些百度贴吧人工客服
  • 网店代运营违法吗seo排名点击器
  • 网站开发工具 哪个好代推广app下载
  • 建设项目水资源论证网站360收录提交
  • 北京服饰网站建设老王搜索引擎入口
  • 企业网站制作找什么人百度指数关键词
  • 网站虚拟交易技术怎么做利用搜索引擎营销成功的案例
  • 坂田网站的建设永久免费linux服务器
  • 北京互联网公司开发的网站微营销是什么
  • 无锡做网站多少钱网络营销环境分析
  • 网站建设网站公司品牌运营中心
  • 建设一个网站要钱吗内容营销案例
  • 网站数据库在空间吗免费的自助建站
  • tp 网站建设源码seo页面优化的方法
  • 买权重网站网站优化资源
  • 搜了网的免费b2b网站口碑营销的例子
  • 网站建设的总体设计思想app推广方案范例