2010-07-14 61 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, "");