- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
默认情况下,ThreeTenABP.LocalDateTime 被转换为
{"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano ":115000000,"秒":18}}
我可以编写一个适配器来支持 ISO 日期字符串 2018-04-10T03:45:26.009
class LocalDateTimeAdapter {
@ToJson
fun toJson(value: LocalDateTime): String {
return FORMATTER.format(value)
}
@FromJson
fun fromJson(value: String): LocalDateTime {
return FORMATTER.parse(value, LocalDateTime.FROM)
}
companion object {
private val FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME
}
}
如何编写一个同时支持两种格式的适配器(fromJson)
{"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano ":115000000,"秒":18}}
2018-04-10T03:45:26.009
除了识别 fromJson
中使用的格式之外,我很好奇 Moshi 在内部如何为 LocalDateTime 执行 toJson/fromJson
最佳答案
您需要使用 JsonReader.peek()
确定传入 JSON 的格式,然后采取相应措施。
首先安装一个可以转换 LocalDateTime
的适配器到一个字符串。该适配器应使用限定符注释。
@Retention(RetentionPolicy.RUNTIME)
@JsonQualifier
@interface DateString {
}
接下来创建字符串适配器。它应该很简单,并且可以委托(delegate)给 Moshi 的内置 Rfc3339DateJsonAdapter。
public final class LocalDateAsStringAdapter {
@ToJson String toJson(@DateString LocalDateTime localDateTime) {
...
}
@FromJson @DateString LocalDateTime fromJson(String string) {
...
}
}
最后创建一个适配器,将其委托(delegate)给 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
的参数和 @FromJson
方法,并且这些参数可以被注释。
如果类型相同,它还依赖于此功能的工作方式。在这里,我们正在制作 JsonAdapter<LocalDateTime>
通过委托(delegate)给另一个 JsonAdapter<LocalDateTime>
.当类型相同时,Moshi 使用其 nextAdapter()
作曲的特征。
关于kotlin - 具有多种格式的 Moshi LocalDateTime 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49750743/
假设我们有这个 JSON: [ { "__typename": "Car", "id": "123", "name": "Toyota Prius", "numDo
此场景发生在使用 Retrofit2 和 Moshi 进行 JSON 反序列化的 Android 应用中。 如果您无法控制服务器的实现,并且该服务器在响应请求的方式上有不一致的行为(也称为“坏情况”)
我正在尝试使用 Android 的 Moshi 库将 Java 对象转换为 JSON。该对象包含一个类型的属性 ArrayList 我正在注册以下适配器来转换对象。 Type type = Type
我有一个响应对象: data class ResponseObject( val notCamelcase: String, val param2: String,
使用 Moshi,您可以为类的字段自定义名称 @Json(name = "your name") string name 但是您可以拥有多个自定义名称吗? @Json(name = "your nam
我有这个模型类 data class RvRange(val low: Int?, val high: Int?) 我的 JSON 响应是 {"low":60799.999999999985,"hig
我有一些看起来像这样的 JSON: { "name" : "Credit Card", "code" : "AUD", "value" : 1000 } 并使用 Moshi 将
我不知道如何在 kotlin 中执行此操作。我想将此字符串转换为对象数组: [ {mode=bus, line=381, line_name=381, direction=Waterloo, oper
我可以从服务器获取以下 JSON 数据: { "id": 1, "groupName": "MyBestFriends" } 在我的 Android 项目中,我使用 Moshi 来处理
我的一些成功的服务器响应是: { "error": null, "data": null } 我的模型是: public class BaseResponse { @Json(name = "
有没有办法设置 Moshi adapter自动创建一个 Object或 List基于 JSON 响应?目前,我可以明确地做到这一点。例如,我可以收到以下响应: { "userId": "1",
假设有以下代表服务器响应的参数化数据类: public class SocketResponse { private String responseMessage; private i
我正在尝试使用 reddit JSON API。有些帖子数据对象包含一个名为 edited 的字段,如果帖子未被编辑,该字段可能包含 bool 值 false,如果帖子被编辑,则可能包含时间戳 int
在我的 Android 应用程序中,在发送了一些注册凭据后,我从服务器获得了以下 JSON 输出: { "response":"successfully registered new user", "
我们有一个多态行为,为了满足它的反序列化,我们为它编写了一个自定义的 Moshi 适配器。 @JsonClass(generateAdapter = true) open class Field @J
我从 OrientDB 服务器收到一些 JSON,看起来像这样: { ... "out": ..., "in": ..., ... } 现在这两个字段out和 in可以
使用 Moshi 序列化数据时,有没有办法自动将命名约定应用于 Moshi? 例如 我有这个类,它遵循 Kotlin 属性命名约定(驼峰式大小写) class Player { var cur
我正在寻找 PolymorphicAdapter但是我能找到的所有多态示例都有一个名为“type”的键或类似的东西,可以用来区分要使用的类。但是就我而言,我没有这样的 key 。我对如何解析这样一个奇
我正在尝试运行使用okhttp3进行Rest api调用的示例代码。 MoshiJsonConvertor.kt: import com.squareup.moshi.JsonClass import
我需要解析一个包含属性“触发器”的对象,它是一个 List .此列表可以包含 2 种类型的触发器:自定义和事件。 这是我的触发器类: @JsonClass(generateAdapter = tr
我是一名优秀的程序员,十分优秀!