微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jackson xmlmapper 动态属性名称

如何解决jackson xmlmapper 动态属性名称

我想生成以下xml:

 <word start="1556" end="1564" TestArticle="36" Chemical="7">Ammonium</word> 
 <word start="1566" end="1584" Endpoint="36" Chemical="7" >per-fluorobutyrate</word> 
 <word start="1585" end="1586" TestArticle="37" >(</word>

我正在使用以下 pojo,它负责处理开始和结束,因为它们是固定的属性名称,但我有“testArticle”、“Endpoint”、“Chemcial”等,它们本质上是动态的,并且具有价值,我不知道如何处理。

public class WordPOJO {

@JacksonXmlProperty(isAttribute = true)
String start;
@JacksonXmlProperty(isAttribute = true)
String end;
@JacksonXmlText
String str;

// not sure if this is the way to do it,but it not outputing in desired format
@XmlAnyElement(lax = true)
List<String> entityList;


public String getStart() {
    return start;
}
public void setStart(String span) {
    this.start = span;
}

public String getEnd() {
    return end;
}
public void setEnd(String span) {
    this.end = span;
}

public List<String> getEntityList()
{
    return entityList;
}

public void setEntityList(List<String> entityList)
{
    this.entityList = entityList;
}
 
//@JacksonXmlElementWrapper(useWrapping = false)
//@JacksonXmlProperty(localName = "word")
public String getstr() {
    return str;
}
public void setStr(String str) {
    this.str = str;
}
}
                

解决方法

如果您预先知道 XML 属性名称 TestArticleChemicalEndpoint, 那么您可以在您的 WordPOJO Java 类中将这些表示为附加属性:

@JacksonXmlProperty(isAttribute = true,localName = "TestArticle")
String testArticle;

@JacksonXmlProperty(isAttribute = true,localName = "Chemical")
String chemical;

@JacksonXmlProperty(isAttribute = true,localName = "Endpoint")
String endpoint;

// Getters and setters (omitted here for brevity)

请注意,您还需要明确指定 XML 名称 由 localName = "...") 匹配您的 XML 内容。 (另见javadoc of @JacksonXmlProperty。) 如果你不这样做,那么杰克逊会含蓄地 选取从您的 Java 属性名称派生的 XML 名称 (testArticle,chemical,endpoint) 不匹配 您的实际 XML 内容。


如果 XML 属性确实是动态的,而您事先不知道它们, 那么您将需要使用 @JsonAnyGetter@JsonAnySetter。 请参阅 javadoc of @JsonAnyGetterJsonAnySetter

不要被注释名称中的 Json 激怒。 Jackson 可以处理 JSON 和 XML 以及更多格式。对于 JSON,您使用 ObjectMapper。 对于 XML,您使用 XmlMapper

Map<String,Object> otherProperties = new HashMap<>();

@JsonAnySetter
public void setOtherProperty(String name,String value) {
    otherProperties.put(name,value);
}

@JsonAnyGetter
public Map<String,Object>  getOtherProperties() {
    return otherProperties;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。