java - 哪些库可用于将对象表示形式转换为表示层中的 JSON/XML?

标签 java json web-applications jboss resteasy

我目前正在开发一个 Web 项目,我的 @Entity 看起来像

@Entity
@Table(name = "variable")
@XmlRootElement
public class Variable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(unique = true, nullable = false)
    private String name;

    @Column
    @Enumerated(EnumType.STRING)
    private VariableType type;

    @Column(nullable = false)
    private String units;

    @Column
    private String description;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_on", nullable = false)
    private Date createdOn;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "retired_on", nullable = true)
    private Date retiredOn;

    @Column(nullable = false)
    private boolean core;
}

为了将此对象转换为 JSON,我将我的实体与 @XmlRootElement 连接起来,将其绑定(bind)到 JAXB

我的 REST 调用方法看起来像

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getVariables() {
        return Response.ok(variableManager.getVariables()).build();
    }

这种方法有一些问题:

  1. 它将持久性与表示层紧密结合。如果后端发生某些变化,它会在表示层上导致/暴露相同的东西。不理想
  2. 表示层上的返回数据可能比在这种情况下不可行的实体数据更少/更多(另一个对象的组合)

在一个典型的web应用层中,通常有3层

presentation/
business/
persistence/

定义表示、将对象转换为 JSON/XML 的决定应该在表示层。我正在寻找可以将我的对象转换为 XML/JSON 而无需使用 @XmlRootElement

将它们绑定(bind)到持久层的方法

请分享你的想法

最佳答案

  1. 在 Web 应用程序中,您指定的三个层(表示层、业务层和持久层)都依赖于它下面的层。业务层类使用来自持久层的服务。演示服务使用业务服务。他们还可以访问持久性服务。如果您碰巧遇到业务对象,则不可避免地必须更改演示文稿中使用它的任何服务。
  2. 如果您想混合不同类型的对象,您很可能必须使用自己的序列化程序。

对于 XML,您有 JAXB。对于 JSON,您可以使用 Jackson 中的任何内容至 Gson .

我相信您正在使用的 JAX-RS 使用 Jackson 将返回的对象序列化为 JSON。

如果您不想使用只会在表示层中使用的 XML 和 JSON 注释来注释您的 Variable 类,您可以提取类的接口(interface),即。使用 getter 方法创建一个接口(interface) VariableInterface。让您的 Variable 类实现它并仅使用 JPA 注释对其进行注释。这些进入您的业务层。在您的演示文稿中,创建一个实现 VariableInterface 的类 PresentationVariable。这样,依赖关系就从表示到业务。然后,您使用 JSON/XML 映射注释来注释您的 PresentationVariable。您在演示文稿中的逻辑必须通过构造函数或实用程序方法将您的 Variable 转换为 PresentationVariable,然后您可以返回它。

package business;

public interface VariableInterface {
    long getId();
    String getName();
    //more
}

@Table
public class Variable implements VariableInterface {
    @Id
    private long id;
    @Column
    private String name; 
    public long getId() {
        return id;
    }
    public long getName() {
        return name
    }
}

package presentation;

import business.VariableInterface;

public class PresentationVariable implements VariableInterface {
    @XmlElement
    private long id;
    @XmlElement
    private String name;
    public long getId() {
        return id;
    }
    public long getName() {
        return name
    }
}

关于java - 哪些库可用于将对象表示形式转换为表示层中的 JSON/XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344978/

相关文章:

java - 使用 Cucumber 从 Maven 中的 Main 运行 Junit 测试

ios - Alamofire 获取请求和 JSON 响应(Yelp API)

php - 将 JSON 字符串转换为 PHP 数组

java - 如何使用同步宝库集合?

java - 是否有一种容器中立的方式来启用目录列表?

java - 如何向 Java 类库中添加一个小的附加包?

java - hibernate多对多仅插入学生表和映射表

java - 在循环中调用 Thread.sleep - 重新绘制组件时使用延迟的正确方法是什么?

javascript - JS : merging 2 arrays within an object

html - CSS3/HTML5 框架,专门用于布局