[英]com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING
[英]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 並反序列化其中包含數組的對象數組
您可以通過注釋掉該屬性並僅發送salesId
和promoCode
來檢查items
是否有問題。
由於您的 json 具有metadata
屬性中的所有數據,因此我創建了一個具有metadata
字段的新 POJO。
class ParentMetadata {
private Metadata metadata;
// getters and setters
}
然后使用以下代碼將 json 解析為 POJO:
ParentMetadata parentMetadata = new Gson().fromJson(jsonStr, ParentMetadata.class);
這對我來說很好用。
此外,由於items
是ArrayList<Object>
類型,在調試期間我可以看到items
被反序列化為 List of LinkedTreeMap
。
我發現了這個問題,並認為我會在這里發布,以防有人遇到同樣的問題。 我清理了項目並再次重建,它運行良好。 畢竟問題不在於代碼。 我在關於 gson 庫的線程上閱讀並嘗試了它。 它對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.