java - 使用 GSON 将 JSON 数组字段转换为类对象

标签 java json gson

大约有十几个相关问题,但似乎没有一个适用于我的案例,所以我会问另一个问题。

我想使用 GSON 将 JSON 中的数组字段转换为 Java 类。

转换此:

{ ...
  coordinates: [1,2,3],
  ...
}

对此:

class MyData {
    ...
    @SerializedName("coordinates")
    final @NonNull Coordinates coordinates;
    ...
}

class Coordinates {
    final float x;
    final float y;
    final float z;

    Coordinates(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

我尝试使用 JsonDeserializer<Coordinates>但我收到以下错误:

JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 485 path $.data[0].placements[0].coordinates

我可以使用

class MyData {
    ...
    @SerializedName("coordinates")
    final @NonNull List<Float> coordinates;
    ...
}

但是我需要手动构建 Coordinates类。

最佳答案

您的Cooperatives类中需要一个构造函数:

Coordinates(float x, float y, float z) {
    this.x = x;
    this.y = y;
    this.z = z;
}

和解串器:

private static final JsonDeserializer<Coordinates> COORDINATES_DESERIALIZER
        = (je, type, jdc) -> {
            if (je.isJsonArray()) {
                JsonArray arr = (JsonArray)je;
                return new Coordinates(
                        arr.get(0).getAsFloat(),
                        arr.get(1).getAsFloat(),
                        arr.get(2).getAsFloat());
            } else if (je.isJsonObject()) {
                JsonObject obj = (JsonObject)je;
                return new Coordinates(
                        obj.get("x").getAsFloat(),
                        obj.get("y").getAsFloat(),
                        obj.get("z").getAsFloat());
            }
            return null;
        };

需要在您的 Gson 对象中注册:

private static final Gson GSON = new GsonBuilder()
       .registerTypeAdapter(Coordinates.class, COORDINATES_DESERIALIZER)
        .create();

关于java - 使用 GSON 将 JSON 数组字段转换为类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57669094/

相关文章:

java - 获取丹麦当前时间

Javascript在对象数组内查找整数属性值

java - Gson(Json)解析异常

java - 无法使用 Gson 将对象(使用 Room DB)序列化为 json 字符串

java - JUnit 测试结果在测试失败时显示 0,但在测试正常时显示 1

java - 如何将基于 gwt 2.5.1 的应用程序升级到 gwt 2.7.0?

php - 如何使用mysql统计每天的一条记录

java - 从 String 解析时 Gson Long 丢失数据

java - 我可以关闭 web.xml 中的 HttpSession 吗?

javascript - 为什么 sortBy() 不起作用