首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Gson解析包含null的原始類型數組異常解決方案

     編輯:程式設計綜合問答

Primitive array can't take null values:使用包裝類型或自定義TypeAdapter

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。業務邏輯中需做非空判斷。

方案二:自定義TypeAdapter處理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();

方案三:預處理JSON字符串(不推薦,脆弱)

正則替換"msgArr":\[null\]為"msgArr":[]或"msgArr":[0],但難以覆蓋所有嵌套情況。

最佳實踐建議

  1. 實體類優先使用包裝類型集合:List msgArr,彈性最高,支持null、可變長。
  2. 若必須用基本類型數組(性能敏感場景),配合方案二自定義Adapter統一處理null語義。
  3. 後端API設計規範:數組字段不應返回null元素,應返回空數組[]或省略字段。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved