心气和平,玉体安宁。——佚名
今天经IOS
开发小哥哥反馈,让我将全局返回的双斜杠\\
替换为单斜杠\
于是有了下面这段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Override protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
MediaType contentType = outputMessage.getHeaders().getContentType(); JsonEncoding encoding = getJsonEncoding(contentType);
Class<?> clazz = (object instanceof MappingJacksonValue mappingJacksonValue ? mappingJacksonValue.getValue().getClass() : object.getClass()); ObjectMapper objectMapper = ReflectUtil.invoke(this, "selectObjectMapper", clazz, contentType); Assert.state(objectMapper != null, () -> "No ObjectMapper for " + clazz.getName());
OutputStream outputStream = StreamUtils.nonClosing(outputMessage.getBody()); try (JsonGenerator generator = objectMapper.getFactory().createGenerator(outputStream, encoding)) { writePrefix(generator, object); String json = objectMapper.writeValueAsString(object); json = json.replace("\\\\", "\\"); generator.writeRaw(json); writeSuffix(generator, object); generator.flush(); } catch (InvalidDefinitionException ex) { throw new HttpMessageConversionException("Type definition error: " + ex.getType(), ex); } catch (JsonProcessingException ex) { throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getOriginalMessage(), ex); } }
|
是在自定义的MappingJackson2HttpMessageConverter
里做的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| import cn.hutool.core.util.ReflectUtil; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import jakarta.annotation.Resource; import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJacksonValue; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StreamUtils;
import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Type;
@Component @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) public class Jackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter implements InitializingBean {
@Resource private JacksonObjectMapper objectMapper;
@Override public boolean canRead(@Nullable MediaType mediaType) { return super.canRead(mediaType) || "text".equals(mediaType.getType()); }
@Override public void afterPropertiesSet() throws Exception { setObjectMapper(objectMapper); }
@Override protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
MediaType contentType = outputMessage.getHeaders().getContentType(); JsonEncoding encoding = getJsonEncoding(contentType);
Class<?> clazz = (object instanceof MappingJacksonValue mappingJacksonValue ? mappingJacksonValue.getValue().getClass() : object.getClass()); ObjectMapper objectMapper = ReflectUtil.invoke(this, "selectObjectMapper", clazz, contentType); Assert.state(objectMapper != null, () -> "No ObjectMapper for " + clazz.getName());
OutputStream outputStream = StreamUtils.nonClosing(outputMessage.getBody()); try (JsonGenerator generator = objectMapper.getFactory().createGenerator(outputStream, encoding)) { writePrefix(generator, object); String json = objectMapper.writeValueAsString(object); json = json.replace("\\\\", "\\"); generator.writeRaw(json); writeSuffix(generator, object); generator.flush(); } catch (InvalidDefinitionException ex) { throw new HttpMessageConversionException("Type definition error: " + ex.getType(), ex); } catch (JsonProcessingException ex) { throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getOriginalMessage(), ex); } }
}
|