如何在Retrofit中同时解析多种数据格式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Retrofit中同时解析多种数据格式相关的知识,希望对你有一定的参考价值。

参考技术A 产生这种问题的原因是:在业务中有多套后台系统,且不同系统接口返回前端的数据格式差异大的时候如何用同一套网络请求同时解析多种数据格式?比如JSON、XML、Jsoup、protobuf以及自定义的数据格式

目前想到三种解决方式思路各有优劣,罗列如下:

拿JSON和XML举例

解一:Retrofit动态设置支持多种数据格式转换工厂

1、Retrofit-Converter.Factory转换工厂

创建ConverterFormat枚举类

声明RequestConverter注解

声明ResponseConverter注解

自定义JsonOrXmlConverterFactory

2、使用方法

创建Retrofit实例时通过addConverterFactory添加JsonOrXmlConverterFactory

在接口上添加注解

RequestConverter、ResponseConverter注解

此方式灵活变通、可以自由拓展加数据格式,请求和响应可以使用不同数据格式!

解二:使用多个OkHttpClient创建对应的Retrofit,OkHttpClient分别添加ConverterFactory

addConverterFactory(GsonConverterFactory.create())

addConverterFactory(JaxbConverterFactory.create())

此方式需要创建多个Retrofit,请求和响应不可以使用不同数据格式!

解三:Retrofit网络请求返回原始数据,自由解析

fun fetchMeleeFight(@QueryMap params: Map?, @HeaderMap headerMap: Map?): ResponseBody?

res.string()

此方式局限性比较大,需要对okhttp3 Request、Response认识比较深,适用于少量不同数据请求,请求和响应不可以使用不同数据格式!

如何在 Java 中解析自定义的多种日期格式

【中文标题】如何在 Java 中解析自定义的多种日期格式【英文标题】:How to parse custom multiple Date formats in Java 【发布时间】:2020-12-30 08:06:03 【问题描述】:

我想在 Java 中解析自定义的多种日期格式。这是我的代码

场景 1: 模式顺序:

yyMMdd'h'HH yyMMdd

DateTimeFormatter 格式化程序 = new DateTimeFormatterBuilder() .appendOptional(DateTimeFormatter.ofPattern("yyMMdd'h'HH")) .appendOptional(DateTimeFormatter.ofPattern("yyMMdd")).toFormatter();

作品:

String dateString1 = "201028h05";

LocalDateTime date1 = LocalDateTime.parse(dateString1, formatter);

不起作用:

String dateString2 = "201028";

LocalDateTime date1 = LocalDateTime.parse(dateString2, formatter);

场景 2: 模式顺序:

yyMMdd yyMMdd'h'HH

DateTimeFormatter 格式化程序 = new DateTimeFormatterBuilder() .appendOptional(DateTimeFormatter.ofPattern("yyMMdd")).toFormatter(); .appendOptional(DateTimeFormatter.ofPattern("yyMMdd'h'HH"))

不起作用:

  String dateString1 = "201028h05";
    
    LocalDateTime date1 = LocalDateTime.parse(dateString1, formatter);
    

作品:

String dateString2 = "201028";

LocalDateTime date1 = LocalDateTime.parse(dateString2, formatter);

如何使其适用于两种日期模式,而不考虑任何输入模式顺序。我不想为此使用任何外部依赖项。

【问题讨论】:

如果交换插入模式的顺序会怎样?从最通用到更具体(而不是从更具体到最通用)? 如果我交换订单就可以了。但是输入值应该与第一个模式匹配,如果不匹配,则会抛出错误。 不确定我是否理解,但第二个 dateString1 与模式 yyMMdd'h'HH 不匹配,因为它缺少整个 'h'HH 组件。您需要将h00 之类的东西添加到第二个dateString1 中才能被第一个模式捕获。 @npinti 用场景更新问题 当字符串中没有小时时,您想要或期望什么结果? 【参考方案1】:

您可以使用[] 定义模式中的可选部分。此外,您需要设置默认值,以便在没有提供时间时不会出现异常。

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyMMdd['h'HH]")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .toFormatter();

String dateString1 = "201028h05";
LocalDateTime date1 = LocalDateTime.parse(dateString1, formatter);
System.out.println(date1);

String dateString2 = "201028";
LocalDateTime date2 = LocalDateTime.parse(dateString2, formatter);
System.out.println(date2);

输出:

2020-10-28T05:00
2020-10-28T00:00

【讨论】:

以上是关于如何在Retrofit中同时解析多种数据格式的主要内容,如果未能解决你的问题,请参考以下文章

解析以多种格式传递的数据......如何从中获取我需要的数据

如何在 Retrofit 库中将 YAML 响应正文解析为 POJO?

android之Retrofit使用

Retrofit的优点

固定格式填报表的制作

Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析