将java对象编组为JSON使用JAX-RS添加空属性

时间:2012-06-29 13:35:40

标签: java json jaxb marshalling jettison

我正在使用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引起的吗?

1 个答案:

答案 0 :(得分:1)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

Jettison实际上不是一个JSON提供程序,而是一个允许XML库生成/使用JSON的API。它做得不错,但有些问题可能会出现,就像你现在遇到的问题一样。您还看到了大小为1的列表未作为JSON数组编组的问题。

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

<强> MyObject1

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;

}

<强> MyObject2

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);
    }

}

<强> input.json /输出

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

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

JAX-RS集成

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