代码之家  ›  专栏  ›  技术社区  ›  John

为什么在json中使用jersey返回带有@的名称?

  •  8
  • John  · 技术社区  · 14 年前

    我使用的JAXB是Jersey JAX-RS的一部分。当我为输出类型请求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"}
    

    那么,为什么有@这个名字?

    3 回复  |  直到 8 年前
        1
  •  9
  •   bdoughan    14 年前

    在JSON中,任何用@xmltattribute映射的属性都将以“@”作为前缀。如果您想删除它,只需用@xmlement注释您的属性即可。

    这大概是为了避免潜在的名称冲突:

    @XmlAttribute(name="foo") public String prop1;  // maps to @foo in JSON
    @XmlElement(name="foo") public String prop2;  // maps to foo in JSON
    
        2
  •  1
  •   DaBlick    12 年前

    如果您正在对XML和JSON进行编组,并且在XML版本中不需要它作为属性,那么建议使用@xmlement是最好的方法。

    但是,如果它需要在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

        3
  •  0
  •   Marek Raki    8 年前

    你必须设置 JSON_ATTRIBUTE_PREFIX 在你 JAXBContext 配置到 "" 默认为 "@" :

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