你需要使用JsonReader.peek()
确定传入 JSON 的格式,然后采取相应的操作。
首先安装一个转换适配器LocalDateTime
到一个字符串。该适配器应该使用限定符注释。
@Retention(RetentionPolicy.RUNTIME)
@JsonQualifier
@interface DateString {
}
接下来创建字符串适配器。它应该很简单,并且可以委托给 Moshi 的内置 Rfc3339DateJsonAdapter。
public final class LocalDateAsStringAdapter {
@ToJson String toJson(@DateString LocalDateTime localDateTime) {
...
}
@FromJson @DateString LocalDateTime fromJson(String string) {
...
}
}
最后创建一个适配器,将其委托给 Moshi 的内置适配器(该适配器将使用{...}
) 或连接到您的字符串适配器。这个更喜欢字符串格式,但你可以做你喜欢的。
public final class MultipleFormatsDateAdapter {
@ToJson void toJson(JsonWriter writer, LocalDateTime value,
@DateString JsonAdapter<LocalDateTime> stringAdapter) throws IOException {
stringAdapter.toJson(writer, value);
}
@FromJson LocalDateTime fromJson(JsonReader reader, @DateString JsonAdapter<LocalDateTime> stringAdapter,
JsonAdapter<LocalDateTime> defaultAdapter) throws IOException {
if (reader.peek() == JsonReader.Token.STRING) {
return stringAdapter.fromJson(reader);
} else {
return defaultAdapter.fromJson(reader);
}
}
}
这是可行的,因为 Moshi 允许您声明多个JsonAdapter
的论点@ToJson
and @FromJson
方法,并且这些参数可以被注释。
如果类型相同,它还依赖于此功能的工作方式。在这里我们制作一个JsonAdapter<LocalDateTime>
通过委托给另一个人JsonAdapter<LocalDateTime>
。当类型相同时,Moshi 使用其nextAdapter()
组成的特征。