Gson將JSON數組反序列化為Java基本類型數組(如int[])時,若JSON數組包含null,會拋出IllegalArgumentException: Primitive array can't take null values。本文提供三種解決方案。
// JSON
{"userName": null, "msgArr": [null], "numrow": 0}
// 實體類
public class MyClass {
public String userName;
public int[] msgArr; // 基本類型數組
}
調用new Gson().fromJson(json, MyClass.class)報錯。
public class MyClass {
public String userName;
public Integer[] msgArr; // 包裝類型數組,支持null
}
Integer[]可直接映射[null, 1, 2],null元素保留為null。業務邏輯中需做非空判斷。
public class IntArrayTypeAdapter extends TypeAdapter {
@Override
public void write(JsonWriter out, int[] value) throws IOException { ... }
@Override
public int[] read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return new int[0]; // 或返回null
}
List list = new ArrayList<>();
in.beginArray();
while (in.hasNext()) {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
list.add(0); // null轉為默認值0
} else {
list.add(in.nextInt());
}
}
in.endArray();
return list.stream().mapToInt(i -> i).toArray();
}
}
// 註冊
Gson gson = new GsonBuilder()
.registerTypeAdapter(int[].class, new IntArrayTypeAdapter())
.create();
正則替換"msgArr":\[null\]為"msgArr":[]或"msgArr":[0],但難以覆蓋所有嵌套情況。
List msgArr ,彈性最高,支持null、可變長。[]或省略字段。