SerializerFeature,serializerfeatureprettyformat

http://www.itjxue.com  2023-01-16 16:45  来源:未知  点击次数: 

java中json对象有没有方法可以把null值转换成空字符串

1.SerializerFeature.WriteMapNullValue 是否输出值为null的字段,默认为false

也就是说有null时会输出而不是忽略(默认策略是忽略,所以看不到为null的字段)

2.WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null?

注意是字段是字段是字段,而不是json.put("key",null),所以用它时,字段为null的可以转换为空字符串。

3.如果让输出的json中所有为null的字符串都变成空字符串,最简单的做法就是加一个值过滤器,这样就避免了有的字段为null,有的字段为空字符的现象。

Spring特殊字符处理

在使用Spring或Spring Boot时一些特殊的参数会被转义,或者因转义导致出现异常情况,本文汇总总结相关问题及解决方案,帮助大家快速定位和解决问题。

问题一:参数特殊符号被后端转义

WEB开发时,前端通过get/post方法传递参数的时,如果实参附带特殊符号,后端接收到的值中特殊符号就会被转义。

例如请求: 张三(1)

后端接收到的name值中“(”和“)”被转义。

针对此问题有以下解决方案:

1、检查web.xml里是否配置了过滤特殊字符的filter,若不需要可以关掉此filter。

2、java中可以使用org.apache.commons.lang包中的public static String unescapeHtml(String str)方法来进行解码。实践中尝试了很多方法没有解决,最后使用了该方法,将接收到的包含特殊字符的字符串通过该方法进行解码。

3、在Controller接收的参数前加上@RequestBody注解,示例如下:

@PostMapping(value = "/add")

@ResponseBody

public String addMessage(@RequestBody ParamVo params) {

}

通常情况下,基于RESTful的API经常使用@RequestBody来自动绑定body中的请求参数到实体类对象。使用@RequestBody能解决大多数情况的问题,但某些特殊字符依旧无法正常解决,还需要通过方案二进行补充解决。

使用该中方案进行数据交互时,前度对应的请求需要 声明dataType和contentType,传递的参数并用JSON.stringify()转为json字符串。

$.ajax({

url: CONTEXTPATH + "/add",

type: 'POST',

dataType: 'JSON',

contentType : 'application/json',

data: JSON.stringify(Data),

success: function (data) {

}

})

问题二:/被转义成%2F导致400错误

前端GET请求url中带有路径参数,参数中有/特殊字符,前端已经转义成了%2F,后端springboot并没有收到这个请求,直接返回了400的错误。

原因:据说是tomcat默认是不支持转义的,需要手动设置一下转化,搜索tomcat的设置可以找到,但在springboot中内置的tomcat,在yml中找不到相关的配置。

解决方案:修改启动类,添加系统参数并重写WebMvcConfigurerAdapter的configurePathMatch方法。

@SpringBootApplication

public class Application extends WebMvcConfigurerAdapter {

public static void main(String[] args) throws Exception {

System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");

SpringApplication.run(Application.class, args);

}

@Override

public void configurePathMatch(PathMatchConfigurer configurer) {

UrlPathHelper urlPathHelper = new UrlPathHelper();

urlPathHelper.setUrlDecode(false);

configurer.setUrlPathHelper(urlPathHelper);

}

}

其中实现WebMvcConfigurerAdapter接口新版本中改为实现WebMvcConfigurer接口。重写的方法名称是一样的。该部分也可以单独在WebMvc的配置类中实现,而不是放在启动类。

当然,设置tomcat的参数是需要写在main方法当中进行设置的。

问题三:整合jackson的转义

Spring Boot默认配置json转换工具就是Jackson, 如果你此时使用的正是Jackson框架,那么可在配置文件中进行是否转义的配置,配置项如下:

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

spring.jackson.serialization.indent_output=true

spring.jackson.serialization.fail_on_empty_beans=false

spring.jackson.defaultPropertyInclusion=NON_EMPTY

spring.jackson.deserialization.fail_on_unknown_properties=false

spring.jackson.parser.allow_unquoted_control_chars=true

spring.jackson.parser.allow_single_quotes=true

其中重点关注allow_unquoted_control_chars项的配置。

当然,相应的配置如果是在配置类中实现的自定义ObjectMapper,可以在自定义时进行设置:

@Configuration

public class JacksonConfig {

}

在类中做过修改中, 配置文件中的配置将不再起作用。

问题四:接收JSON时发生转义字符绑定对象失败

在做Spring boot 项目时发生json转义字符绑定对象失败,原因是json里面有些字段包括空格,反斜杠等,如果框架没有对这些json进行转化时,就会报类似如下错误

org.codehaus.jackson.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 9)): has to be escaped using backslash to be included in string value

at [Source: java.io.StringReader@10cfc2e3 ; line: 1, column: 2461]

解决办法:

1、pom.xml文件增加fastjson依赖。

dependency

groupIdcom.alibaba/groupId

artifactIdfastjson/artifactId

version1.2.15/version

/dependency

如果项目中已经引入则无需新增该依赖。

2、增加配置类

@SpringBootApplication

public class JsonController extends WebMvcConfigurerAdapter {

@Override

public void configureMessageConverters(ListHttpMessageConverter? converters) {

super.configureMessageConverters(converters);

FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

FastJsonConfig fastJsonConfig = new FastJsonConfig();

fastJsonConfig.setSerializerFeatures(

SerializerFeature.PrettyFormat

);

fastConverter.setFastJsonConfig(fastJsonConfig);

converters.add(fastConverter);

}

}

这里的配置方法同问题二中的一样,新版本Spring Boot 通过WebMvcConfigurer接口来完成。

serializerfeature在哪个jar包中

System.out.println(JSON.toJSONString(1",SerializerFeature.BrowserCompatible));System.out.println(JSON.toJSONString("\u4E2D\u56FD",SerializerFeature.BrowserCompatible));

SerializerFeature

? ? QuoteFieldNames,输出key时是否使用双引号,默认为true

? ? UseSingleQuotes,使用单引号,默认为false

? ? WriteMapNullValue,是否输出值为null字段 ,默认为false

? ? WriteEnumUsingToString,Enum输出name()或者original,默认为false

? ? WriteEnumUsingName,用枚举name()输出

? ? UseISO8601DateFormat,Date使用ISO8601格式输出,默认为false

? ? WriteNullListAsEmpty,List字段如果为null,输出为[],而非null

? ? WriteNullStringAsEmpty,将为null的字段值显示为""

? ? WriteNullNumberAsZero,数值字段如果为null,输出为0,而非null

? ? WriteNullBooleanAsFalse,Boolean字段如果为null,输出为false,而非null

? ? SkipTransientField,如果是true,类中的Get方法对应的Field是?瞬 态?,序列化时将会被忽略。默认为true

? ? SortField,按字段名称排序后输出。默认为false

json数据避免$ref 循环引用

在调用JSONObject.toJSONString(data)方法是,当两个Json对象属性中引用了同一个对象,除了第一个对象会正常显示,其他的引用会用 “$ref”代替。可以通过传第二个参数避免这种情况

JSONObject.toJSONString(json, SerializerFeature.DisableCircularReferenceDetect)

参考:

使用JSONObject转换之后字段丢失

方法:

JSONObject.toJSONString(object),转换之后发现属性值为null的属性被删除掉了,查询资料之后发现需要使用SerializerFeature序列化属性:

JSONObject.toJSONString(Object object, SerializerFeature... features)

序列化属性值:

QuoteFieldNames———-输出key时是否使用双引号,默认为true

WriteMapNullValue——–是否输出值为null的字段,默认为false

WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null

WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null

WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null

WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

示例:

JSONObject.toJSONString(data, SerializerFeature.WriteMapNullValue);

(责任编辑:IT教学网)

更多

相关HTML/Xhtml文章

推荐HTML/Xhtml文章