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

电子商务网站建设与管理习题答案五种销售渠道

电子商务网站建设与管理习题答案,五种销售渠道,永久免费的网页游戏,网站建设项目甘特图Hello,大家好,我是灰小猿!最近在开发的过程中遇到了两个在处理Json解析方面比较有用的注解:JsonTypeInfo和JsonSubTypes,所以在这里记录分享一下使用。JsonTypeInfo和JsonSubTypes是Jackson库中用于处理多态类型的注解…

Hello,大家好,我是灰小猿!

最近在开发的过程中遇到了两个在处理Json解析方面比较有用的注解:@JsonTypeInfo和@JsonSubTypes,所以在这里记录分享一下使用。

@JsonTypeInfo和@JsonSubTypes是Jackson库中用于处理多态类型的注解。

@JsonTypeInfo

@JsonTypeInfo注解用于指定在序列化和反序列化过程中如何处理多态类型。

多态类型指的是在反序列化时,JSON 数据可能对应多个子类型。为了正确读取对象的类型,我们需要在 JSON 数据中添加一些类型信息。

  • use: 定义使用哪种类型识别码,有以下几种可选值:

    • JsonTypeInfo.Id.CLASS: 使用完全限定类名作为识别码。

    • JsonTypeInfo.Id.MINIMAL_CLASS: 若基类和子类在同一包内,使用类名(忽略包名)作为识别码。

    • JsonTypeInfo.Id.NAME: 使用逻辑名称作为识别码。

    • JsonTypeInfo.Id.CUSTOM: 自定义识别码,由 @JsonTypeIdResolver 对应。

    • JsonTypeInfo.Id.NONE: 不使用识别码。

  • include: 指定识别码如何包含在 JSON 数据中,有以下几种可选值:

    • JsonTypeInfo.As.PROPERTY: 作为数据的兄弟属性。

    • JsonTypeInfo.As.EXISTING_PROPERTY: 作为 POJO 中已经存在的属性。

    • JsonTypeInfo.As.EXTERNAL_PROPERTY: 作为扩展属性。

    • JsonTypeInfo.As.WRAPPER_OBJECT: 作为一个包装对象。

    • JsonTypeInfo.As.WRAPPER_ARRAY: 作为一个包装数组。

  • property: 指定识别码的属性名称。此属性在 use 为 JsonTypeInfo.Id.CLASSJsonTypeInfo.Id.MINIMAL_CLASS 或 JsonTypeInfo.Id.NAME 时有效。

  • defaultImpl: 指定反序列化时使用的默认类型,如果类型识别码不存在或无效。

  • visible: 指定类型标识符是否在反序列化时保留,默认为 false。

@JsonSubTypes

@JsonSubTypes注解用于指定多态类型的子类型。它可以通过属性value来指定子类型的映射关系。通过name来标识当识别码的属性名称为什么值时对应为这个类型,并且每个子类型都需要使用@JsonSubTypes.Type注解进行标注,并指定子类型的类和名称。

@JsonTypeInfo和@JsonSubTypes是结合使用的,他们可以实现对多态类型的序列化和反序列化。

在序列化时,Jackson库会根据@JsonTypeInfo注解指定的类型信息包含方式和使用机制,将对象的类型信息包含在序列化结果中。

在反序列化时,Jackson库会根据@JsonTypeInfo注解指定的类型信息使用机制,将序列化结果中的类型信息解析出来,并根据@JsonSubTypes注解指定的子类型映射关系,将序列化结果转换为正确的对象类型。

这两个注解的优势在于可以灵活处理多态类型的序列化和反序列化。它可以帮助开发人员在处理多态类型时,准确地恢复对象的类型信息,从而实现正确的对象转换和处理。

多级@JsonTypeInfo和@JsonSubTypes的应用场景包括但不限于以下几个方面:

  1. 在分布式系统中,多级@JsonTypeInfo和@JsonSubTypes可以帮助实现跨系统的对象传输和转换。
  2. 在消息队列中,多级@JsonTypeInfo和@JsonSubTypes可以帮助实现不同消息类型的序列化和反序列化。
  3. 在RESTful API中,多级@JsonTypeInfo和@JsonSubTypes可以帮助实现不同资源类型的序列化和反序列化。
  4. 在数据库表设计中,同类对象的不同类型属性采用Json存储时可以使用这两个注解帮助进行对象的序列化和反序列化。

实际的使用案例

在设计数据表时,如果一个对象可以有多重类型,每一种类型之间有公共的属性和自身特有的属性,那么在定义数据表时,我们一般不会定义多张数据表进行存储,也不会将所有的属性都作为列添加到表中,那么这个时候,我们就可以将公共属性作为数据表的列,将特有的属性以Json的形式存储在一个字段中,而在数据模型定义中,这些特有的属性可以定义为继承自同一个父类的不同属性类,

这个时候在进行这个对象的序列化和反序列化的过程中,就需要使用到@JsonTypeInfo和@JsonSubTypes注解。

假如我们有一个商品类Commodity,但是在业务中我的商品除了有统一的名称、价格属性外,不同的商品还有不同的属性表示,比如食品有保质期,家电有能效标识和质量

那么我们创建Commodity的数据表时就可以这样创建:

其中使用commodity_attr_json字段来存储不同类型的商品的属性值的json,commodity_type用来标识不同的商品类型。

CREATE TABLE 'Commodity'{'id' varchar(32) NOT NULL,'name' varchar(32) NOT NULL,'price' int NOT NULL,'commodity_type' int DEFAULT 0,'commodity_attr_json' json NOT NULL COMMENT '不同商品特有属性的JSON',PRIMARY KEY ('id')
} 

在数据模型定义中,model的定义和数据表一致:

@Getter
@Setter
public class CommodityModel {private String id;private String name;private int price;private CommodityTypeEnum commodityType;private String commodityAttrJson;public static CommodityModel newInstance(CommodityDTO dto) {CommodityModel model = new CommodityModel();model.setId(dto.getId());model.setName(dto.getName());model.setPrice(dto.getPrice());model.setCommodityType(dto.getCommodityType());CommodityAttrDTO commodityAttr = dto.getCommodityAttr();ObjectMapper objectMapper = new ObjectMapper();String commodityAttrJson = null;try {commodityAttrJson = objectMapper.writeValueAsString(commodityAttr);} catch (JsonProcessingException e) {throw new RuntimeException(e);}model.setCommodityAttrJson(commodityAttrJson);return model;}
}

DTO的定义中,对象的属性不再使用json表示,而是有了对应的DTO对象

@Getter
@Setter
public class CommodityDTO {private String id;private String name;private int price;private CommodityTypeEnum commodityType;private CommodityAttrDTO commodityAttr;public static CommodityDTO newInstance(CommodityModel model) {CommodityDTO dto = new CommodityDTO();dto.setId(model.getId());dto.setName(model.getName());dto.setPrice(model.getPrice());dto.setCommodityType(model.getCommodityType());ObjectMapper objectMapper = new ObjectMapper();CommodityAttrDTO commodityAttrDTO = null;try {commodityAttrDTO = objectMapper.readValue(model.getCommodityAttrJson(), CommodityAttrDTO.class);} catch (JsonProcessingException e) {throw new RuntimeException(e);}dto.setCommodityAttr(commodityAttrDTO);return dto;}
}

定义统一的对象属性接口

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,property = "commodityType")
@JsonSubTypes({@JsonSubTypes.Type(value = FoodstuffCommodityAttrDTO.class,name = CommodityTypeEnum.Constant.FOODSTUFF),@JsonSubTypes.Type(value = ElectronicCommodityAttrDTO.class,name = CommodityTypeEnum.Constant.ELECTRONIC)
})
public interface CommodityAttrDTO {}

定义每一个商品类型具体的属性DTO,并继承CommodityAttrDTO 

/*** 食品*/
@Getter
@Setter
public class FoodstuffCommodityAttrDTO implements CommodityAttrDTO{/*** 保质期*/private Timestamp expirationDate;
}
/*** 电子商品*/
@Getter
@Setter
public class ElectronicCommodityAttrDTO implements CommodityAttrDTO {/*** 能效等级*/private int energyEfficiencyGrade;/*** 商品重量*/private int weight;
}

通过上面的数据定义,即可方便的将model和DTO之间进行转换。

以上就是@JsonTypeInfo和@JsonSubTypes注解的主要作用和一个实际的使用场景分析。如果大家有好的场景或补充,可以一起聊聊!

我是灰小猿,我们下期见!


文章转载自:

http://eNEUuI9p.yrwqz.cn
http://NShqw6a3.yrwqz.cn
http://Udrt9iJn.yrwqz.cn
http://QwcKnzOh.yrwqz.cn
http://wvrMRDcp.yrwqz.cn
http://yRhXkOUf.yrwqz.cn
http://EWq1Zi1N.yrwqz.cn
http://47VZoJKi.yrwqz.cn
http://89GcRZMQ.yrwqz.cn
http://aH4AmfG5.yrwqz.cn
http://G1uF5Qhf.yrwqz.cn
http://wus9trhd.yrwqz.cn
http://OWqV0UQJ.yrwqz.cn
http://wka0AG7Y.yrwqz.cn
http://aSFuqA8c.yrwqz.cn
http://VcXYiyqH.yrwqz.cn
http://2dFNqFIw.yrwqz.cn
http://UFZh9IMm.yrwqz.cn
http://YNb85taP.yrwqz.cn
http://VtOCFnMu.yrwqz.cn
http://nXEcM8Xk.yrwqz.cn
http://gkDOKS3u.yrwqz.cn
http://wj7EJ8iX.yrwqz.cn
http://SMLJqkCU.yrwqz.cn
http://nmmwoGPh.yrwqz.cn
http://RCJ5gW4M.yrwqz.cn
http://MaRyLlAL.yrwqz.cn
http://9POOvfaQ.yrwqz.cn
http://kaTfpfBq.yrwqz.cn
http://NDzRx1pq.yrwqz.cn
http://www.dtcms.com/wzjs/691041.html

相关文章:

  • 网站建设网站推广优化向国旗致敬做时代新人网站
  • 百度开户做网站2400慈溪做无痛同济 网站
  • 建设什么网站可以上传视频葫芦岛市网站建设
  • 连云港网站建设公司在线制作网站的平台
  • 代做网站转账截图四川建设行业网站有哪些
  • 如何选择网站域名贵州省城乡建设厅网站首页
  • 公司内部网站建设网站建设公司墨子网络
  • 企业定制网站价格表阳西县住房和城乡建设部网站
  • 优惠券网站要怎么做推广南昌网站开发商哪家强
  • wordpress怎么改变文章的域名济南网站优化培训
  • 房地产设计方案视频优化是什么意思
  • 公司网站源码 带wap手机站个人网页代码模板
  • 怎么做营销型网站设计isapi_rewrite wordpress
  • 织梦网站后台进不去深圳网站建设公司麦
  • 嘉兴网站开发与制作网站建设费用进会计什么科目
  • 您网站建设ps做网站字号大小
  • 宁波市环境建设保护局网站全球旅游网站排名
  • 响应式网站的宽度微信推广平台
  • 两个域名同一个网站做优化泉州网站建设多少钱
  • 营销型网站建设域名wordpress保存php失败
  • 帝国网站认证码免费下载app并安装
  • 网站怎么做需要花钱吗十大传媒公司排名
  • 建站平台 在线提交表格功能门户网站建设工具
  • seo优化网站快速排名建站快车管理
  • 建设储蓄卡网站怎么建立自己的网站域名
  • 建设局网站投诉网站建设的实施制作阶段包括
  • 企业网站推广外包合肥浦发建设集团网站
  • 形象类网站网站总体设计怎么写
  • 上海公司牌照价格走势seo顾问服务 乐云践新专家
  • 山东网站建设哪里有广州市公司网站建设报价