json的结构主要就是[],代表这是一个数组,{},代表这是一个对象,
对象转成json
String json=JSON.toJSONString(new BankTableHead().setTableHeadInfo("日期"));
map集合转成json
list转成json
这是list集合判空的方式
CollUtil.isEmpty(fieldList);
这是String字符串判断为空的方式,两种方式都是hu tool包下的方法,isBlank()可以判断为null或者""的情况
StrUtil.isBlank(str);
将json转换成对象或者集合的方法就是:
JSON.parseObject(); 需要转换成什么类型就用什么类型接收
List<String> list=JSON.parseObject(json);
需要注意的是将json转换成map集合的方式: 记住后边的{}
Map<String,BankFileInfo> map=JSON.parseObject(json,new TypeReference<Map<String,BankFileInfo>>(){});
JSON还提供了大量的枚举以及注解,可以对自己想要生成的json格式进行定制化处理
String json = JSON.toJSONString(bankFileInfo,SerializerFeature.WriteNullStringAsEmpty);
SerializerFeature 枚举(序列化)
类型 | 起始版本 | 含义 | 备注 |
---|---|---|---|
QuoteFieldNames | 输出数据时使用双引号,默认为 true | ||
UseSingleQuotes | 输出数据时使用单引号,默认为 false | ||
WriteMapNullValue | 输出值为 null 的字段,默认为 false | ||
WriteEnumUsingToString | enum 输出 name() 或者 original,默认为 false | ||
WriteEnumUsingName | enum 输出 name() | ||
UseISO8601DateFormat | date 使用 ISO8601 格式输出,默认为 false | ||
WriteNullListAsEmpty | 1.1 | list 字段如果为 null,输出为 [],而非 null | |
WriteNullStringAsEmpty | 1.1 | 字符类型字段如果为null,输出为 ”“,而非 null | |
WriteNullNumberAsZero | 1.1 | 数值字段如果为 null,输出为 0,而非 null | |
WriteNullBooleanAsFalse | 1.1 | boolean 字段如果为 null,输出为 false,而非 null | |
SkipTransientField | 1.1 | 如果是 true,类中的 getXXX 方法对应的 Field 是 transient,序列化时将会被忽略。默认为 true | |
SortField | 1.1 | 按字段名称排序后输出,默认为 false | |
WriteTabAsSpecial | 1.1.1 | 把 \t 做转义输出,默认为 false (不推荐) | |
PrettyFormat | 1.1.2 | 结果是否格式化,默认为 false | |
WriteClassName | 1.1.2 | 序列化时写入类型信息,默认为 false。反序列化是需用到 | |
DisableCircularReferenceDetect | 1.1.6 | 消除对同一对象循环引用的问题,默认为 false | |
WriteSlashAsSpecial | 1.1.9 | 对斜杠 ‘/’ 进行转义 | |
BrowserCompatible | 1.1.10 | 将中文都会序列化为 \uxxxx 格式,字节数会多一些,但是能兼容IE 6,默认为false | |
WriteDateUseDateFormat | 1.1.14 | 全局修改日期格式,默认为 false JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); | |
NotWriteRootClassName | 1.1.15 | 不输出根类名称 | |
DisableCheckSpecialChar | 1.1.19 | 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性,默认为 false | |
BeanToArray | 1.1.35 | 将对象转为数组 | |
WriteNonStringKeyAsString | 1.1.37 | 非字符串键输出为字符串 | |
NotWriteDefaultValue | 1.1.42 | 不设置默认值 | |
BrowserSecure | 1.2.6 | 浏览器安全 | |
IgnoreNonFieldGetter | 1.2.7 | 忽略没有 getXXX 方法的字段 | |
WriteNonStringValueAsString | 1.2.9 | 非字符串值输出为字符串 | |
IgnoreErrorGetter | 1.2.11 | 忽略错误的 getXXX 方法的字段 | |
WriteBigDecimalAsPlain | 1.2.16 | ||
MapSortField | 1.2.27 | 允许 map 类型排序字段 |
Feature 枚举(特征)
类型 | 起始版本 | 含义 | 备注 |
---|---|---|---|
AutoCloseSource | 允许自动关闭流(默认:true) | ||
AllowComment | 允许注释(默认:false) | ||
AllowUnQuotedFieldNames | 允许使用非双引号属性名称 | ||
AllowSingleQuotes | 允许单引号来包住属性名称和字符串值 | ||
InternFieldNames | |||
AllowISO8601DateFormat | 允许使用 ISO8610 进行日期格式化 | ||
AllowArbitraryCommas | 允许多重逗号 | ||
UseBigDecimal | 使用 BigDecimal 类来装载数字,否则用的是 Double(默认:false) | ||
IgnoreNotMatch | 1.1.2 | 忽略不匹配 | |
SortFeidFastMatch | 1.1.3 | 排序字段优先匹配 | |
DisableASM | 1.1.3 | 禁用ASM | |
DisableCircularReferenceDetect | 1.1.7 | 禁用循环引用检测 | |
InitStringFieldAsEmpty | 1.1.10 | 无值字符串设置为空串 | |
SupportArrayToBean | 1.1.35 | 支持数组转对象 | |
OrderedField | 1.2.3 | 排序字段 | |
DisableSpecialKeyDetect | 1.2.5 | 禁用特殊字符检测 | |
UseObjectArray | 1.2.9 | 使用对象数组 | |
SupportNonPublicField | 1.2.22 | 支持非公有字段 | |
IgnoreAutoType | 1.2.29 | 忽略自动类型 | |
DisableFieldSmartMatch | 1.2.30 | 禁用字段智能匹配 |
用法:
JSONObject reqJSON = JSONObject.parseObject(body, Feature.OrderedField);
可以都自己试试,还有一些注解,例如
@JSONField
对于时间格式的参数进行传参时,有时候会因为格式出现异常,我们需要在实体类上加以下注解:
@JsonFormat(locale = "zh" ,timezone = "GMT+8",pattern = "yyyy-MM-dd");
将list<map>转换成list<对象>
JSON.parseArray(JSON.toJSONString(cloudFacade.queryUserByIdList(commonRequest)), IbsaasUser.class)
map转为对象
Person person = JSONObject.parseObject(JSONObject.toJSONString(source), Person.class);
将object转换为lIst<object>
cn.hutool.json.JSONArray otherList = JSONUtil.parseArray(cloudFacade.queryOrgInfo(commonRequest).get("list")); List<IbsaasUser> otherIbsaasUsers = JSONUtil.toList(otherList, IbsaasUser.class);
关于fastjson转字符串报错的问题:write javaBean error
JSON.toJSONString(requestErrorInfo, SerializerFeature.IgnoreErrorGetter))