首页 > 解决方案 > 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。

标签: javamoshi

解决方案


这是一种方法:(省略导入)

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);
    }
}

使用默认值,它明确地将字段设置为零。


推荐阅读