2010-07-14 62 views
8

我使用的是JAXB,它是Jersey JAX-RS的一部分。当我为我的输出类型请求JSON时,所有属性名称都以星号开头,为什么在JSON中使用@返回的名称使用泽西语

此对象;

package com.ups.crd.data.objects; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlType; 

@XmlType 
public class ResponseDetails { 
    @XmlAttribute public String ReturnCode = ""; 
    @XmlAttribute public String StatusMessage = ""; 
    @XmlAttribute public String TransactionDate =""; 
} 

成为本,

{"ResponseDetails":{"@transactionDate":"07-12-2010", 
      "@statusMessage":"Successful","@returnCode":"0"} 

那么,为什么有@的名字吗?

回答

9

任何使用@XmlAttribute映射的属性都将在JSON中以“@”作为前缀。如果你想删除它,只需用@XmlElement注释你的属性。

想必这是为了避免潜在的名称冲突:

@XmlAttribute(name="foo") public String prop1; // maps to @foo in JSON 
@XmlElement(name="foo") public String prop2; // maps to foo in JSON 
+0

这不适合我! '@ XmlAttribute'我在字段和@ @ XmlElement之前得到@我没有得到任何输出! – sajjadG 2014-02-12 20:54:36

1

如果你要编组XML和JSON,你不需要它作为XML版本的属性,那么建议使用@XmlElement是最好的方式去。

但是,如果它需要是XML版本中的属性(而不是元素),那么您确实有一个相当简单的选择。

您可以轻松设置一个关闭“@”插入的JSONConfiguration

这将是这个样子:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 
private JAXBContext context; 

public JAXBContextResolver() throws Exception { 
    this.context= new JSONJAXBContext(
     JSONConfiguration 
      .mapped() 
      .attributeAsElement("StatusMessage",...) 
      .build(), 
      ResponseDetails.class); 
} 

@Override 
public JAXBContext getContext(Class<?> objectType) { 
    return context; 
} 
} 

也有一些其他的替代文件位置:

http://jersey.java.net/nonav/documentation/latest/json.html

+0

链接已损坏。我查了最新的球衣文档,里面没有关于'JSONConfiguration'的东西! – sajjadG 2014-02-12 20:56:46

0

您的JAXBContext配置来设置JSON_ATTRIBUTE_PREFIX""它默认是"@"

properties.put(JAXBContextProperties.JSON_ATTRIBUTE_PREFIX, "");