gson 如何构造类以反序列化此嵌套数组?

vd8tlhqk  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(189)

我正在尝试从JSON响应中反序列化一个嵌套数组。这是我第一次得到一个数组的数组,我不太确定如何构造我的类来处理它。

{
"prices": [
            [
                1641670404234,
                0.01582586939240936
            ],
            [
                1641674037525,
                0.015999047707867396
            ],
            [
                1641677655158,
                0.016072905257982606
            ]

            ...
         ],
}

如果括号是{而不是[

{
"prices": {
            {
                1641670404234,
                0.01582586939240936
            },
            {
                1641674037525,
                0.015999047707867396
            },
            {
                1641677655158,
                0.016072905257982606
            }
           }
            ...
}

我可以用
第一个
然而,由于它是[,我不太确定如何构造它。
我尝试向其中添加另一个List Package 器,但这会引发错误
第一个
我也试过用JSONArray Package 它

@SerializedName("prices")
private List<JSONArray<Price>> prices;

但这并不完全正确

我试着搜索其他的SO答案,但我找不到任何例子,它是两个连续的[ [括号。
它们都是{ [[ {
正确的做法是什么?

wbrvyc0a

wbrvyc0a1#

解决这个问题的正确方法是为Price类编写一个自定义的TypeAdapter。(使用List<Price> prices字段),并让它们更接近地表示实际数据。那么您必须手动验证JSON数据是否格式正确,并且必须自己将List<BigDecimal>转换为Price对象。
下面是Price类的TypeAdapter实现的外观:

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,您还可以在TypeAdapterFactory中创建此类型适配器,并获取BigDecimal的默认Gson适配器。这允许在您自己的类型适配器中重用Gson的内置适配器,但对于BigDecimal,这种开销可能不值得。
然后,您可以在GsonBuilder示例上注册适配器,也可以在Price类上放置一个@JsonAdapter注解,该注解引用适配器。您可能希望通过在适配器上调用nullSafe()来创建一个null安全的适配器变体(或者您在适配器中手动实现null处理)。

bkkx9g8r

bkkx9g8r2#

假设这是正确的JSON:

{
    "prices": [
        [
            1641670404234,
            0.01582586939240936
        ],
        [
            1641674037525,
            0.015999047707867396
        ],
        [
            1641677655158,
            0.016072905257982606
        ]
    ]
}

然后,您可以使用此模型将数据反序列化为:

JAVA语言

public class PricesModel {
    public ArrayList<ArrayList<Double>> prices;
}

Kotlin

data class PricesModel (

  @SerializedName("prices" ) var prices : ArrayList<ArrayList<Double>> = arrayListOf()

)

JavaKotlin的便捷JSON转换器。

相关问题