【问题标题】:Java: How to structure or pattern a class so that we can map composed Object during Runtime?Java:如何构造或模式化一个类,以便我们可以在运行时映射组合的对象?
【发布时间】:2019-12-24 10:35:55
【问题描述】:

使用一个返回 json 的 rest api,该 json 具有一些固定格式和每个端点的其他变化。我正在使用将传入的 json 映射到 java 类的 gson 库。

所以我有以下抽象资源:

@Getter
@Setter
public class AbstractResource {
    @SerializedName("Meta")
    @Expose
    private List<Meta> meta = null;
    @SerializedName("Body")
    @Expose
    private List<AbstractBody> body = null;

AbstractBody 有以下内容:

public class AbstractBody {
    @SerializedName("Body")
    @Expose
    private Computer computer = null;
    @SerializedName("Links")
    @Expose
    private List<Link> links = null;

AbstractResource 对所有端点都是通用的,但在抽象正文中,它在一个端点返回计算机,在另一个端点返回许可证,其他端点返回集群。一切都在 json 的 Body 字段中。所以每次 AbstractBody 都会发生变化。

目前我必须在不同的包中一次又一次地制作这两个类。所以主要的事情是这样的。

 ComputerResource agreement = gson.fromJson(json, ComputerResource .class);

我想为 abstractresource 和 abstractbody 制作通用包,并在运行时决定它应该进入哪个类。

如何修改上述结构来做到这一点?

【问题讨论】:

    标签: java inheritance design-patterns java-8 gson


    【解决方案1】:

    你可以使用TypeToken:

    表示泛型类型T。子类化 TypeToken 允许在运行时保留类型信息。

    假设我们有两个 JSON 结构:

    {"meta": "value", "body": {"license": "true"}}
    {"meta": "value", "body": {"computer": "true"}}
    

    它们由一个泛型类AbstractResource表示

    public class AbstractResource<T> {
        private String meta;
        private T body;
    }
    public class Computer {
        private boolean computer;
    }
    public class License {
        private boolean license;
    }
    
    

    反序列化时,Gson 需要被告知如何处理可以通过TypeToken 提供的泛型主体:

    Type computer = new TypeToken<AbstractResource<Computer>>() {}.getType();
    AbstractResource<Computer> resource = g.fromJson(json, computer);
    
    Type license = new TypeToken<AbstractResource<License>>() {}.getType();
    AbstractResource<License> resource = g.fromJson(json, license);
    

    这允许将任意嵌套结构反序列化为T 类型的通用字段body。通过将bodys 类型更改为List&lt;T&gt;,它可以轻松适应处理嵌套结构列表。

    【讨论】:

    • @Idz:感谢您的解决方案。我已经检查过这个 TypeToken 是 gson 类。是否可以使用 jdk 类代替第三方类来做类似的事情?
    • JDK不提供JSON绑定功能,常用的是Gson和Jackson。您可以查看用于 JSON 绑定的 Java API JSON-B,它(目前)仅作为参考实现 Yasson 作为替代方案,但这也会引入依赖关系。
    猜你喜欢
    • 2014-04-27
    • 2019-04-20
    • 2014-07-03
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多