Mor*_*gan 2 java xml jackson jackson-dataformat-xml
将对象序列化为 XML 并使用 \n @JacksonXmlRootElement(namespace = "http://...")\n指定属性的命名空间时,Jackson 会将 \xc2\xb4wstxns1\xc2\xb4 附加或前置到命名空间。例如,假设我们有这些类:
VtexSkuAttributeValues.java
\n\n@JacksonXmlRootElement(localName = "listStockKeepingUnitName")\npublic class VtexSkuAttributeValues {\n\n @JacksonXmlProperty(localName = "StockKeepingUnitFieldNameDTO", namespace = "http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts")\n @JacksonXmlElementWrapper(useWrapping = false)\n private VtexSkuAttributeValue[] stockKeepingUnitFieldNameDTO;\n\n public VtexSkuAttributeValue[] getStockKeepingUnitFieldNameDTO() {\n return stockKeepingUnitFieldNameDTO;\n }\n\n public void setValues(VtexSkuAttributeValue[] values) {\n this.stockKeepingUnitFieldNameDTO = values;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\nVtexSkuAttributeValue.java
\n\n@JacksonXmlRootElement(localName = "StockKeepingUnitFieldNameDTO", namespace = "http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts")\npublic class VtexSkuAttributeValue {\n\n private String fieldName;\n private FieldValues fieldValues;\n private int idSku;\n\n public int getIdSku() {\n return idSku;\n }\n\n public String getFieldName() {\n return fieldName;\n }\n\n public FieldValues getFieldValues() {\n return fieldValues;\n }\n\n public void setIdSku(int idSku) {\n this.idSku = idSku;\n }\n\n public void setFieldName(String fieldName) {\n this.fieldName = fieldName;\n }\n\n public void setFieldValues(FieldValues fieldValues) {\n this.fieldValues = fieldValues;\n }\n\n @JacksonXmlRootElement(localName = "fieldValues", namespace = "http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts")\n public static class FieldValues {\n @JacksonXmlProperty(namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")\n @JacksonXmlElementWrapper(useWrapping = false)\n public String[] string;\n\n public String[] getString() {\n return string;\n }\n\n public void setValues(String[] values) {\n this.string = values;\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后我使用XmlMapper来序列化并获取:
<listStockKeepingUnitName>\n <wstxns1:StockKeepingUnitFieldNameDTO xmlns:wstxns1="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts">\n <fieldName>talle</fieldName>\n <fieldValues>\n <wstxns2:string xmlns:wstxns2="http://schemas.microsoft.com/2003/10/Serialization/Arrays">6184</wstxns2:string>\n </fieldValues>\n <idSku>258645</idSku>\n </wstxns1:StockKeepingUnitFieldNameDTO>\n <wstxns3:StockKeepingUnitFieldNameDTO xmlns:wstxns3="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts">\n <fieldName>color</fieldName>\n <fieldValues>\n <wstxns4:string xmlns:wstxns4="http://schemas.microsoft.com/2003/10/Serialization/Arrays">6244</wstxns4:string>\n </fieldValues>\n <idSku>258645</idSku>\n </wstxns3:StockKeepingUnitFieldNameDTO>\n</listStockKeepingUnitName>\nRun Code Online (Sandbox Code Playgroud)\n\n尽管这是有效的 XML,但我正在使用的 Web 服务不接受它。我对其进行了调试,这是由于wstxnsJackson 由于某种原因添加的标签中的属性所致。\n有没有办法阻止 Jackson 将其添加到标签中。我能想到的唯一解决方法是对生成的 XML 执行 string.replaceAll,但这显然并不理想。
编写XML Jackson使用javax.xml.stream.XMLStreamWriter. 您可以配置该类的实例并为命名空间定义自己的前缀,并根据需要设置默认前缀。为此,我们需要扩展com.fasterxml.jackson.dataformat.xml.XmlFactory类并重写创建实例的方法XMLStreamWriter。示例实现如下所示:
class NamespaceXmlFactory extends XmlFactory {
private final String defaultNamespace;
private final Map<String, String> prefix2Namespace;
public NamespaceXmlFactory(String defaultNamespace, Map<String, String> prefix2Namespace) {
this.defaultNamespace = Objects.requireNonNull(defaultNamespace);
this.prefix2Namespace = Objects.requireNonNull(prefix2Namespace);
}
@Override
protected XMLStreamWriter _createXmlWriter(IOContext ctxt, Writer w) throws IOException {
XMLStreamWriter writer = super._createXmlWriter(ctxt, w);
try {
writer.setDefaultNamespace(defaultNamespace);
for (Map.Entry<String, String> e : prefix2Namespace.entrySet()) {
writer.setPrefix(e.getKey(), e.getValue());
}
} catch (XMLStreamException e) {
StaxUtil.throwAsGenerationException(e, null);
}
return writer;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式使用它:
import com.fasterxml.jackson.core.io.IOContext;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.util.StaxUtil;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
public class XmlMapperApp {
public static void main(String[] args) throws Exception {
String defaultNamespace = "http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts";
Map<String, String> otherNamespaces = Collections.singletonMap("a", "http://schemas.microsoft.com/2003/10/Serialization/Arrays");
XmlMapper xmlMapper = new XmlMapper(new NamespaceXmlFactory(defaultNamespace, otherNamespaces));
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
System.out.println(xmlMapper.writeValueAsString(new VtexSkuAttributeValues()));
}
}
Run Code Online (Sandbox Code Playgroud)
在VtexSkuAttributeValues课堂上你可以声明:
public static final String DEF_NMS = "http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts";
Run Code Online (Sandbox Code Playgroud)
并将其用于应用作默认命名空间的每个类和字段。例如:
@JacksonXmlProperty(localName = "StockKeepingUnitFieldNameDTO", namespace = DEF_NMS)
Run Code Online (Sandbox Code Playgroud)
对于您不想更改名称的属性,可以使用:
@JacksonXmlProperty(namespace = VtexSkuAttributeValues.DEF_NMS)
Run Code Online (Sandbox Code Playgroud)
上面的代码打印一些随机数据:
<listStockKeepingUnitName>
<StockKeepingUnitFieldNameDTO xmlns="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts">
<fieldName>Name1</fieldName>
<fieldValues>
<a:string xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">6184</a:string>
</fieldValues>
<idSku>123</idSku>
</StockKeepingUnitFieldNameDTO>
<StockKeepingUnitFieldNameDTO xmlns="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts">
<fieldName>Name1</fieldName>
<fieldValues>
<a:string xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">6184</a:string>
</fieldValues>
<idSku>123</idSku>
</StockKeepingUnitFieldNameDTO>
</listStockKeepingUnitName>
Run Code Online (Sandbox Code Playgroud)
如果这不是您想要的,您可以使用该代码并尝试其他可用于配置此实例的方法。
使用Jackson版本来创建此示例。2.9.9
| 归档时间: |
|
| 查看次数: |
7914 次 |
| 最近记录: |