package com.foxinmy.weixin4j.http.message; import java.io.IOException; import java.io.InputStream; import com.alibaba.fastjson.JSON; import com.foxinmy.weixin4j.http.HttpHeaders; import com.foxinmy.weixin4j.http.HttpResponse; import com.foxinmy.weixin4j.http.MimeType; import com.foxinmy.weixin4j.util.FileUtil; import com.foxinmy.weixin4j.util.IOUtil; import com.foxinmy.weixin4j.util.RegexUtil; /** * JSON 转换 * * @className JsonMessageConverter * @author jinyu * @date Jul 20, 2016 * @since JDK 1.6 */ public class JsonMessageConverter extends AbstractMessageConverter { public static final JsonMessageConverter GLOBAL = new JsonMessageConverter(); private static final String JSO = "json"; private static final int BRACE = 1 << '{'; private static final int BRACKET = 1 << '['; private static final int MASK = BRACE | BRACKET; public JsonMessageConverter() { super(MimeType.APPLICATION_JSON, MimeType.TEXT_JSON, new MimeType( "application", "*+json")); } @Override public boolean canConvert(Class<?> clazz, HttpResponse response) { if (!super.canConvert(clazz, response)) { String disposition = response.getHeaders().getFirst( HttpHeaders.CONTENT_DISPOSITION); String fileName = RegexUtil .regexFileNameFromContentDispositionHeader(disposition); return (fileName != null && FileUtil.getFileExtension(fileName) .equalsIgnoreCase(JSO)); } return true; } @Override protected boolean supports(Class<?> clazz, byte[] content) { return (MASK & (1 << content[0])) != 0; } @Override protected <T> T convertInternal(Class<? extends T> clazz, InputStream body) throws IOException { byte[] bytes = IOUtil.toByteArray(body); return JSON.parseObject(bytes, 0, bytes.length, charset.newDecoder(), clazz); } }