1

我正在使用 jax-rs 并添加由 JAXRSOutInterceptor 在 Jetty 中编组的实体,但 JSON 输出正在修改为额外的空属性,如下所示:“$”:“”

JSONProvider 的创建和配置如下:

JSONProvider jsonProvider = new JSONProvider();
jsonProvider.setConvertTypesToStrings(true);
jsonProvider.setIgnoreNamespaces(true);
jsonProvider.setIgnoreMixedContent(true);
jsonProvider.setUnmarshallAsJaxbElement(true);
providers.add(jsonProvider);

它也被编组为使用名称空间的 XML,但我不希望它们出现在 JSON 输出和输入中。

正在编组的对象与此类似:

@XmlRootElement(name="myObject1")
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject1 implements Serializable {

    MyObject2 a;
    MyObject2 b;
    MyObject2 c;

// includes getters, setters, hashCode, equals, toString,   
}

当 MyObject2 是:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject2 implements Serializable {

    String x;
    String y;
    List<String> z;

// includes getters, setters, hashCode, equals, toString,   
}

其余输出如下:

{
   "myObject1": {
      "a": {
         "x": "value1",
         "y": "value2",
         "z": "value3",
         "$": ""
      },
      "$": ""
   }
}

如何摆脱结尾的“$”:“”我读到 Jettison(这是我正在使用的默认 JSONProvider 实现)默认情况下将用 @XmlValue 映射的属性表示为“$”,但没有属性?

这是由实现 Serializable 引起的吗?

4

1 回答 1

1

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

Jettison 并不是真正的 JSON 提供者,而是一个允许 XML 库生成/使用 JSON 的 API。它做得不错,但是可能会出现像您现在遇到的问题一样的问题。您还会看到大小为 1 的列表未编组为 JSON 数组的问题。

如果您找不到使用当前设置进行此操作的方法。以下是您可以使用 MOXy 作为 JSON 提供程序执行的操作:

我的对象1

package forum11262807;

import java.io.Serializable;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="myObject1")
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject1 implements Serializable {

    MyObject2 a;
    MyObject2 b;
    MyObject2 c;

}

我的对象2

package forum11262807;

import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject2 implements Serializable {

    String x;
    String y;
    List<String> z;

}

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供程序,您需要包含一个jaxb.properties在与域模型相同的包中调用的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

下面是一些独立的代码来演示 JSON 的读/写。

package forum11262807;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(MyObject1.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setProperty("eclipselink.media-type", "application/json");
        File json = new File("src/forum11262807/input.json");
        MyObject1 myObject1 = (MyObject1) unmarshaller.unmarshal(json);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.marshal(myObject1, System.out);
    }

}

输入.json/输出

生成的 JSON 消息不包含任何"$"属性,大小为 1 的列表是表示为 JSON 数组的属性。

{
   "myObject1" : {
      "a" : {
         "x" : "value1",
         "y" : "value2",
         "z" : [ "value3" ]
      }
   }
}

JAX-RS 集成

MOXy 包含 MOXyJsonProvider 类,可以轻松在 JAX-RS 应用程序中进行配置:

于 2012-06-29T18:15:04.460 回答