2

我使用 Jersey 作为 JSR 311 实现。我试图转换为 JSON 的对象如下所示:

@XmlRootElement
public class deliveryTimes{
  private Integer id;
  private Short type;
  private Integer orderId;
  /* ... more fields and autogenerated Getters & Setters ... */
}

JSON结果是:

{"deliveryTimes":
[{"type":"1","orderId":"30449",/* ... other fields ... */ },
/* ... */
]}

用文字来说:“id”字段正在丢失。在我的其他对象中,id 字段具有其他名称,例如 orderId、customerId ......并且这些字段不会丢失。

我的 pom.xml 看起来像这样:

<!-- other stuff -->
<!--  JERSEY -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-grizzly2</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.11</version>
</dependency>

<!-- Jersey + Spring -->
<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-spring</artifactId>
    <version>1.11</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- other stuff -->

没有进一步的配置。我在球衣网站或谷歌上没有找到任何有用的东西,所以我在这里发布了我的第一篇文章。

我缺少任何配置选项吗?你如何 JSONify id 字段?

4

2 回答 2

2

id可能无法编组的原因有很多。

1 - 它有一个空值

默认情况下,JAXB 实现不会封送空值。如果您希望编组一个空值,请务必添加以下注释

@XmlElement(nillable=true)

有关更多信息,请参阅:

2 - 有一个字段但不是没有访问器(get/set)方法

默认情况下,JAXB 只映射公共字段和访问器。不符合此条件的任何内容都被视为未映射。您可以通过指定来解决此问题 XmlAccessorType(XmlAccessType.FIELD)

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class deliveryTimes{
    ...
}

或通过注释字段

@XmlRootElement
public class deliveryTimes{
    @XmlElement
    private Integer id;
}

有关更多信息,请参阅:

3 - 有get方法但没有set方法

如果有 get 方法但没有附带的 set 方法,那么您的 JAXB 实现会将其视为未映射的属性。要解决此问题,您只需将 get 方法与@XmlElement.

于 2012-04-27T16:19:59.253 回答
0

“id”没有什么特别之处。从@XmlRootElement您的班级开始,我假设您正在使用 JAXB 进行编组(泽西岛的默认设置)。在默认配置中,JAXB 需要一个 getter 将字段编组为 XML/JSON,并需要一个 setter 将字段从 XML/JSON 解组。在这种情况下,我猜你缺少一种public Integer getId()方法。@XmlElement您可以通过添加到您的id字段轻松更改此行为。

于 2012-04-27T12:25:20.803 回答