java - Moshi:解析假设为整数的 NULL 值
问题描述
我有一个像
public class Data{
int integer_value = 0;
}
然后我从服务器得到 json{"integer_value":null}
当我试图解析它时
String json = "{\"integer_value\":null}"
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<Data> jsonAdapter = moshi.adapter(Data.class);
Data data = jsonAdapter.fromJson(json);
它会抛出异常:
Caused by: com.squareup.moshi.JsonDataException: Expected an int but was NULL at path $.integer_value
我怎样才能防止这种情况?我希望它好像“integer_value”不存在。因此它将使用默认值 0。
解决方案
这是一种方法:(省略导入)
public class Test {
public static void main(String args[]) throws IOException {
String json = "{\"integer_value\":null}";
Moshi moshi = new Moshi.Builder().add(new ZeroWhenNullAdapter()).build();
JsonAdapter<Data> jsonAdapter = moshi.adapter(Data.class);
Data data = jsonAdapter.fromJson(json);
}
}
@Retention(RetentionPolicy.RUNTIME)
public @interface Nullable { // you can use any annotation named 'Nullable'
}
@Retention(RUNTIME)
@JsonQualifier
public @interface ZeroWhenNull {}
public class Data {
@ZeroWhenNull
int integer_value = 0;
}
public class ZeroWhenNullAdapter {
// this isn't really needed, but Moshi insists that adapters work both
// ways as far as I can tell
@ToJson
String toJson(@ZeroWhenNull int n) {
return Integer.toString(n);
}
@FromJson
@ZeroWhenNull
int fromJson(@Nullable String n) {
return n == null ? 0 : Integer.parseInt(n);
}
}
这不使用默认值,它明确地将字段设置为零。
推荐阅读
- entity-framework - 在 .NET Core 2+ 中第一次迁移之前将数据库恢复到初始状态?
- python - 带有情节的线序
- visual-studio-code - 如何创建提示窗口以显示 gif 并在几秒钟后关闭窗口?
- angular - 启用内容编码:gzip 用于 angular(7) Web 应用程序中的生产构建?
- svelte - 如何在 Svelte 中设置事件的全局样式
- sql - 在一行中查询多个事务
- android - 类的协程单元测试失败
- typescript - 带有 *ngFor 的 ng-template 问题在 Angular 8
- c++ - 如何计算字符串并将其存储在变量中?
- java - 程序切片插件 Indus 和 kaveri 在 eclipse 中是如何工作的?