簡體   English   中英

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:需要一個字符串,但為 BEGIN_ARRAY

[英]com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY

我正在嘗試使用 Gson 將傳入的 Json(如下所示)解析為 Java 對象。 Json 請求似乎是一個有效的請求,但我在解析它時遇到以下異常。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 5 column 19 path $.metadata.
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226) ~[gson-2.8.5.jar:?]
        at com.google.gson.Gson.fromJson(Gson.java:927) ~[gson-2.8.5.jar:?]

傳入 Json 請求:

{
    "metadata": {
        "salesId": "123",
        "promoCode": "2010",
        "items": [
            {
                "0": {
                    "productCode": "1234",
                    "total": 169900
                },
                "1": {
                    "productCode": "4567",
                    "total": 19900
                }
            }
        ]
    }
}

解析邏輯:

protected <T extends GenericModel> Optional<T> convertFromJson(final String json, final Class<T> clazz) {
        if (StringUtils.isEmpty(json)) {
            return Optional.empty();
        }
        return Optional.of(new Gson().fromJson(json, clazz));
    }

Java類:

public class Metadata {
    private String salesId;
    private String promoCode;
    private ArrayList<Object> items = new ArrayList<Object>();

    public String getSalesId() {
        return salesId;
    }

    public void setSalesId(String salesId) {
        this.salesId = salesId;
    }

    public String getPromoCode() {
        return promoCode;
    }

    public void setPromoCode(String promoCode) {
        this.promoCode = promoCode;
    }

    public ArrayList<Object> getItems() {
        return items;
    }

    public void setItems(ArrayList<Object> items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return "Metadata{" +
                "salesId=" + getSalesId() +
                "promoCode=" + getPromoCode() +
                "items=" + getItems() +
                '}';
    }
}

請注意 Metadata.java 是一個內部類。

一直試圖解決這個問題,但沒有運氣。 誰能告訴我如何解決它? TIA。

我猜問題出在您嘗試反序列化的 json 中的items對象上。

Metadata類中的items是一個ArrayList<Object>但這並沒有告訴 gson 如何反序列化它。

相反,您應該嘗試為Item創建另一個 POJO,然后將這些items ArrayList<Item> 像這樣: Gson 並反序列化其中包含數組的對象數組

您可以通過注釋掉該屬性並僅發送salesIdpromoCode來檢查items是否有問題。

由於您的 json 具有metadata屬性中的所有數據,因此我創建了一個具有metadata字段的新 POJO。

class ParentMetadata {
    private Metadata metadata;
    // getters and setters
}

然后使用以下代碼將 json 解析為 POJO:

ParentMetadata parentMetadata = new Gson().fromJson(jsonStr, ParentMetadata.class);

這對我來說很好用。

此外,由於itemsArrayList<Object>類型,在調試期間我可以看到items被反序列化為 List of LinkedTreeMap

我發現了這個問題,並認為我會在這里發布,以防有​​人遇到同樣的問題。 我清理了項目並再次重建,它運行良好。 畢竟問題不在於代碼。 我在關於 gson 庫的線程上閱讀並嘗試了它。 它對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM