我在将XML SOAP返回转换为相应的POJO类时遇到问题。XML返回如下所示:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header></env:Header>
<env:Body>
<ns2:teste xmlns:ns2="http://teste.com.br/">
<retorno>
<codigoRetorno>000</codigoRetorno>
<descricao>Consulta Realizada com Sucesso</descricao>
<item>
<a>teste</a>
<b>teste</b>
<c>teste</c>
</item>
<item>
<a>teste</a>
<b>teste</b>
<c>teste</c>
</item>
</retorno>
</ns2:teste >
</env:Body>
</env:Envelope>
我尝试使用Jackson XMLMAPER,但是在反序列化过程中,我不能把它作为根元素考虑返回节点。它将“信封”节点视为根节点。
我需要只提取返回节点并转换到我的pojo类。
另一个问题是“项目”节点应该是集合的一部分,但是没有对这些元素进行分组的父节点。
有没有人知道一个解析器可以对这种类型的xml进行反序列化?
我找到的最干净的解决方案是使用JSOUP:
private <T> T parseResponse(HttpEntity entity, Class<T> typeTarget) throws Exception {
try {
String xmlSoapResponse = EntityUtils.toString(entity, StandardCharsets.UTF_8);
String xmlRetorno = extractXmlElement(xmlSoapResponse, "retorno");
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
xmlMapper.registerModule(new JavaTimeModule());
return xmlMapper.readValue(xmlRetorno.toString(), typeTarget);
} catch (Exception e) {
throw new Exception("Fail during parser", e);
}
}
private String extractXmlElement(String xmlString, String nodeTagNameElement) {
Document document = Jsoup.parse(xmlString, "", Parser.xmlParser());
document.outputSettings().prettyPrint(false);
Elements retorno = document.getElementsByTag(nodeTagNameElement);
return retorno.toString();
}
您可以通过以下方式合并流XML解析器(StAX)和XmlMapper
:
import java.io.StringReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class Deser {
// @formatter:off
private static final String JSON = " <env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <env:Header></env:Header>\n" +
" <env:Body>\n" +
" <ns2:teste xmlns:ns2=\"http://teste.com.br/\">\n" +
" <retorno>\n" +
" <codigoRetorno>000</codigoRetorno>\n" +
" <descricao>Consulta Realizada com Sucesso</descricao>\n" +
" <item>\n" +
" <a>teste</a>\n" +
" <b>teste</b>\n" +
" <c>teste</c>\n" +
" </item>\n" +
" <item>\n" +
" <a>teste</a>\n" +
" <b>teste</b>\n" +
" <c>teste</c>\n" +
" </item>\n" +
" </retorno>\n" +
" </ns2:teste >\n" +
" </env:Body>\n" +
"</env:Envelope>";
// @formatter:on
private static final String TARGET_ELEMENT = "retorno";
public static void main(String[] args) throws Exception {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
XMLInputFactory f = XMLInputFactory.newFactory();
XMLStreamReader sr = f.createXMLStreamReader(new StringReader(JSON));
while (sr.hasNext()) {
int type = sr.next();
if (type == XMLStreamReader.START_ELEMENT && TARGET_ELEMENT.equals(sr.getLocalName())) {
Retorno r = xmlMapper.readValue(sr, Retorno.class);
System.out.println(r.getDescricao());
}
}
}
}
class Retorno {
private int codigoRetorno;
private String descricao;
public int getCodigoRetorno() {
return codigoRetorno;
}
public void setCodigoRetorno(int codigoRetorno) {
this.codigoRetorno = codigoRetorno;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
}
这将产生:
成功领事
根据需要调整代码,这只是为了证明如何让它完成您需要的任务!
问题内容: 我对iOS应用程序开发非常陌生,并且从服务器收到以下响应: 请任何人帮助我了解如何在我的应用程序中使用员工ID和员工姓名。 问题答案: 您的JSON数据看起来像“嵌套JSON”,这意味着您必须将其反序列化两次。 第一个反序列化从您的JSON数据中提取一个字符串: 现在是字符串 再次是JSON数据。第二个反序列化提取数组: 现在您可以像访问它
是否可以解析对POJO的JSON响应,即使响应只发回行和列? 我从API得到这个响应: 这是我正在使用的代码,为简洁起见,将其缩短,以连接到API并获得JSON响应,我使用Gson通过反序列化器类传递JSON响应: 这是我制作的反序列化类: 我希望JSON响应采用这种格式,这会使序列化更简单: 抱歉发了这么长的帖子,但是反序列化POJO响应的最佳方法是什么? 多谢了。
问题内容: 我从REST服务返回以下JSON响应。现在,我需要将以下JSON响应反序列化为POJO。我正在与杰克逊合作。 在上面的json中,是一个可以具有多个json对象的JSON数组。现在也是JSON数组。现在棘手的部分是,我可以在每个类别对象中拥有多个级别,并且我不知道我将拥有多少个级别。给定以上JSON,我需要提取每个类别和last的内容。所以应该是这样的: 其中是类别的taskId,是l
问题内容: 我正在使用CURL发送请求。响应数据类型为。如何解析此数据并将其插入数据库? JSON输出: 问题答案: 如果您的变量是字符串json之类的,则必须使用function将其解析为 对象 或 数组 : 输出值 现在,您可以将变量作为数组使用: 参考文献: json_decode -PHP手册
凌空JSON解析技术对此有用吗?