This can be achieved using Jsoup and Jackson object mapper:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
Document doc = Jsoup.parse(html);
String responseMessage = doc.body()
.getElementsByAttributeValue("name", "responseMessage")
.first()
.attributes()
.get("value");
String status = doc.body()
.getElementsByAttributeValue("name", "status")
.first()
.attributes()
.get("value");
String url = doc.body()
.getElementsByAttributeValue("name", "url")
.first()
.attributes()
.get("value");
Response response = new Response();
response.setResponseMessage(responseMessage);
response.setStatus(status);
response.setUrl(url);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(response);
System.out.println(json);
Output:
{"responseMessage":"Successfully Registered","status":"SUCCESS","url":"xxxx"}
Update:
If it's needed to convert HTML string without manual webscraping, it's also possible (but will work for XHTML only I suppose, because parser will break on non-XML-compliant markup).
POM dependency:
org.eclipse.persistence
org.eclipse.persistence.moxy
2.5.2
jar
Bean definition (getter/setter skipped):
@XmlRootElement(name = "html")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
@XmlPath("body/form/input[@name='url']/@value")
private String url;
@XmlPath("body/form/input[@name='status']/@value")
private String status;
@XmlPath("body/form/input[@name='responseMessage']/@value")
private String responseMessage;
}
Create message converter:
private static HttpMessageConverter createXmlHttpMessageConverter() throws JAXBException {
MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter();
// I added lot of mediatypes, leave necessary ones
xmlConverter.setSupportedMediaTypes(Arrays.asList(
MediaType.APPLICATION_XML, MediaType.TEXT_HTML, MediaType.TEXT_PLAIN, MediaType.TEXT_XML
));
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setClassesToBeBound(Response.class);
// without this jaxb will complain about doctype in the beginning
jaxb2Marshaller.setSupportDtd(true);
xmlConverter.setMarshaller(jaxb2Marshaller);
xmlConverter.setUnmarshaller(jaxb2Marshaller);
return xmlConverter;
}
REST template initialization:
RestTemplate rest = new RestTemplate();
rest.getMessageConverters().add(0, createXmlHttpMessageConverter());
Also you'll need to set MOXy as JAXB provider. I used for this code
System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY, "org.eclipse.persistence.jaxb.JAXBContextFactory");
but it can be done also in other ways.
This all will allow you to perform call:
Response response = rest.postForEntity(url, request, Response.class);
And from Response instance it should be trivial to retrieve JSON using Jackson.