java json html模板,spring boot - Parse text/html to application/json with restTemplate in java - Stack...

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值