首页 > 解决方案 > 反序列化 JSON 以创建 POJO 和相关参考

问题描述

我正在尝试使用 Oracle APEX ORDS RESTful API 创建一个与另一个 POJO 相关的 POJO。

上下文

让我从解释我必须处理的上下文开始。

考虑以下 POJO:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Brand {
    private Pencil[] pencils;
    // standard getters and setters
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Pencil {
    private int length;
    private Brand brand;
    private Color color;
    // standard getters and setters
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Color {
    private int red;
    private int green;
    private int blue;
    // standard getters and setters
}

APEX 中的数据库结构如下所示:

CREATE TABLE Brand (
    id int NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE Pencil (
    id int NOT NULL,
    length int NOT NULL,
    brand_id int NOT NULL,
    color_id int NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (brand_id) REFERENCES Brand(id),
    FOREIGN KEY (color_id) REFERENCES Color(id)
);
CREATE TABLE Color (
    id int NOT NULL,
    red int NOT NULL,
    green int NOT NULL,
    blue int NOT NULL,
    PRIMARY KEY (id)
);

ORDS URI 模板../brand/{brand_ID}/pencils使用以下获取请求处理程序源,源类型为“Query”:

SELECT p.length, c.red, c.green, c.blue FROM pencil p
    LEFT OUTER JOIN color c ON c.id = p.color_id
        WHERE p.brand_id = :brand_ID

请求可能会返回类似于以下 JSON 的内容:

{
    "items": [
        {
            "length": 100,
            "red": 150,
            "green": 200,
            "blue": 250,
        },
        {
            "length": 50,
            "red": 100,
            "green": 150,
            "blue": 200,
        }
    ],
    "first:" {
        "$ref": "..."
    }
}

问题

在创建 POJO 的客户端读取此 JSON 时,我遇到了一个问题。我能够将 Pencil 实例的长度属性设置为正确的值。但是 Pencil 实例的颜色属性将保持不变null。我猜这是因为 Pencil 不知道 JSON 属性红色、绿色和蓝色,因此被忽略了。如果我是正确的,那么我可能有两种解决方案,但对于那些我不知道如何实现它们的解决方案。

几种可能的解决方案

  1. 通过注解定位 Color 类的属性并停止忽略它们,声明它们可以用于何处。
  2. color不知何故,使用 Color 类的键和属性将 JSON 对象添加到响应中的每个数组项。

标签: javajsonoracle-apexpojo

解决方案


我认为您可以尝试一些事情。

  1. 您可以修改 json 响应对象以匹配您的数据建模 POJO。

  2. 如果您无法修改 json 响应以匹配您的客户端数据建模,您可以创建一个与 json 响应匹配的 JsonDto,然后根据需要使用 JsonDto 手动构建您的 POJO。

希望这可以帮助。:)


推荐阅读