我正在嘗試從 JSON 回應反序列化嵌套陣列。這是我第一次得到一個陣列陣列,我不太確定如何構造我的類來處理它。
{
"prices": [
[
1641670404234,
0.01582586939240936
],
[
1641674037525,
0.015999047707867396
],
[
1641677655158,
0.016072905257982606
]
...
],
}
如果括號{不是[
{
"prices": {
{
1641670404234,
0.01582586939240936
},
{
1641674037525,
0.015999047707867396
},
{
1641677655158,
0.016072905257982606
}
}
...
}
我可以使用
@SerializedName("prices")
private List<Price> prices;
public class Price {
private long date;
private BigDecimal price;
}
但是,因為它是[相反的,所以我很不確定如何構建它。
我嘗試向其中添加另一個List包裝器,但這會引發錯誤
@SerializedName("prices")
private List<List<Price>> prices;
IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 26 path $.prices[0][0]
我也試過用 JSONArray
@SerializedName("prices")
private List<JSONArray<Price>> prices;
但這不太對

我嘗試搜索其他 SO 答案,但找不到任何兩個連續[ [括號的示例。
它們都是{ [或[ {。
正確的方法是什么?
uj5u.com熱心網友回復:
假設這是正確的 JSON:
{
"prices": [
[
1641670404234,
0.01582586939240936
],
[
1641674037525,
0.015999047707867396
],
[
1641677655158,
0.016072905257982606
]
]
}
然后您可以使用此模型將資料反序列化為:
爪哇:
public class PricesModel {
public ArrayList<ArrayList<Double>> prices;
}
科特林:
data class PricesModel (
@SerializedName("prices" ) var prices : ArrayList<ArrayList<Double>> = arrayListOf()
)
方便的 JSON 轉換器到Java和Kotlin。
uj5u.com熱心網友回復:
解決此問題的正確方法是TypeAdapter為您的Price班級撰寫自定義。這樣做的好處是您可以保持模型類原樣(使用List<Price> prices欄位),并讓它們更接近地表示實際資料。相反,如果您將 JSON 資料決議為List<List<BigDecimal>>或類似,則必須手動驗證 JSON 資料是否格式正確,并且必須自己將其轉換List<BigDecimal>為Price物件。
以下是TypeAdapter您的Price類的實作方式:
class PriceTypeAdapter extends TypeAdapter<Price> {
@Override
public void write(JsonWriter out, Price value) throws IOException {
out.beginArray();
out.value(value.date);
out.value(value.price);
out.endArray();
}
@Override
public Price read(JsonReader in) throws IOException {
in.beginArray();
Price priceObj = new Price();
priceObj.date = in.nextLong();
// nextString() automatically converts JSON numbers to String, if necessary
// This is similar to how Gson's default adapter for BigDecimal works
priceObj.price = new BigDecimal(in.nextString());
in.endArray();
return priceObj;
}
}
注意:BigDecimal作為此處顯示的手動閱讀的替代方法,您可以在 a 中創建此型別配接器TypeAdapterFactory并獲取BigDecimal. 這允許在您自己的型別配接器中重用 Gson 的內置配接器,但這里的BigDecimal開銷可能不值得。
然后,您可以在GsonBuilder實體上注冊配接器,也可以@JsonAdapter在Price參考配接器的類上放置注釋。如果您使用該GsonBuilder方法,您可能希望null通過呼叫nullSafe()它來創建配接器的-safe 變體(或者您null在配接器中手動實作處理)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407754.html
標籤:
上一篇:FusedLocationProviderClient崩潰并出現java.lang.NullPointerException:指定為非null的引數位置為null
