目标
实现 Json 字符串和类的相互转换
开发环境
| 名称 | 版本 |
|---|---|
| 操作系统 | Windows 10 X64 |
| JDK | JDK1.8(jdk-8u151-windows-x64) |
| IntelliJ IDEA | IntelliJ IDEA 2018.3 |
| Maven | Maven 3.6.0 |
使用 fastjson,gson
pom.xml 引用
<properties><fastjson.version>1.2.38</fastjson.version><gson.version>2.8.5</gson.version></properties><dependencies><!--Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- 用于日志切面中,以 json 格式打印出入参(本来使用阿里的 FASTJSON, 但是对于文件上传的接口,打印参数会报错,换为 Gson) --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>${gson.version}</version></dependency></dependencies></dependencies>
代码
1.测试类
package com.test.invoice.data;import com.alibaba.fastjson.annotation.JSONField;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.experimental.Accessors;/*** TRbtTestData 参数类** @author:* @version:* @date: 2019-08-09 08:57*/@Data@Accessors(chain = true) //@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。public class TRbtTestData {@ApiModelProperty("id")@JSONField(name = "id")private String id;@ApiModelProperty("名称")@JSONField(name = "name")private String name;@ApiModelProperty("版本号")@JSONField(name = "version")private String version;}
2.转换代码
/*** ClassToJson* @param data TRbtTestData* @param convertType 1:使用 GSON 转换,2:使用 alibaba.fastjson 转换* @return JsonString*/@PostMapping("/Test/ClassToJson")@ApiOperation(value = "类转 Json",httpMethod = "POST",response = ResponseVO.class,notes="类转 Json")public ResponseVO ClassToJson(@RequestBody TRbtTestData data,@RequestParam(value="convertType",required = true) String convertType){ResponseVO responseVO = new ResponseVO<String>();if (convertType.equals("1")){GsonBuilder builder = new GsonBuilder();Gson gson = builder.create();responseVO.setData(gson.toJson(data));}else if (convertType.equals("2")){responseVO.setData(JSON.toJSONString(data));}responseVO.setCode(ResponseCode.OK.value());return responseVO;}/*** JsonToClass* @param data String* @param convertType 1:使用 GSON 转换,2:使用 alibaba.fastjson 转换* @return Class*/@PostMapping("/Test/JsonToClass")@ApiOperation(value = "Json 转类",httpMethod = "POST",response = ResponseVO.class,notes="Json 转类")public ResponseVO JsonToClass(@RequestBody String data,@RequestParam(value = "convertType",required = true) String convertType){ResponseVO responseVO = new ResponseVO<TRbtTestData>();if (convertType.equals("1")){GsonBuilder builder = new GsonBuilder();Gson gson = builder.create();responseVO.setData(gson.fromJson(data,TRbtTestData.class));}else if (convertType.equals("2")){responseVO.setData(JSON.parseObject(data,TRbtTestData.class));}responseVO.setCode(ResponseCode.OK.value());return responseVO;}
测试
1.类转 Json
2.Json 转换为类
扩展-Json 转 List 对象
String jsonStr = configService.get("bg_list").getSysValue();List<ListVO> listData = JSON.parseArray(jsonStr,ListVO.class);
获取 Json 字符串中指定的属性值
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.JSONPath;public static void main(String[] args){String data_toKenCompanyInfoVo="{\"accountNo\":\"000001\",\"openId\":\"000002\"}";JSONObject jsonObject = JSON.parseObject(data_toKenCompanyInfoVo);String accountNo = JSONPath.eval(jsonObject,"$.accountNo").toString();String openId = JSONPath.eval(jsonObject,"openId").toString();log.info("accountNo:"+accountNo);log.info("openId:"+openId);}
输出
accountNo:000001openId:000002
使用 ObjectMapper
//对象转json字符串public static String convertToJson(Object obj, boolean enableNull) {ObjectMapper mapperJson = new ObjectMapper();//mapperJson.setSerializationInclusion(JsonInclude.Include.NON_NULL);//mapperJson.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);if (!enableNull) {mapperJson.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);}SerializationConfig config = mapperJson.getSerializationConfig().without(MapperFeature.AUTO_DETECT_CREATORS,MapperFeature.AUTO_DETECT_SETTERS,MapperFeature.AUTO_DETECT_GETTERS,MapperFeature.AUTO_DETECT_IS_GETTERS);mapperJson.setConfig(config);mapperJson.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);String dataJson = null;try {dataJson = mapperJson.writeValueAsString(obj);} catch (JsonProcessingException e) {e.printStackTrace();}return dataJson;}//json 转对象public static <T> T convertToObject(String json, TypeReference<T> typeRef, boolean isHaveTime) {T t = null;try {ObjectMapper objectMapper = new ObjectMapper();String pattern = "yyyy/MM/dd";if (isHaveTime) {pattern = "yyyy/MM/dd HH:mm:ss";}objectMapper.setDateFormat(new SimpleDateFormat(pattern));//解决反序列化时json字段比实体字段多的问题objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//忽略大小写objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);t = objectMapper.readValue(json, typeRef);} catch (Exception e) {log.error("convertToObject >>> deserialize fail:", e);}return t;}@Datapublic static class Student{private Integer id;private String name;}public static void main(String[] args) {try{Student student = new Student();student.setId(1);student.setName("name-1");String json = convertToJson(student,false);System.out.println(json);Student student1 = convertToObject(json, new TypeReference<Student>() {},true);System.out.println(student1.getId());System.out.println(student1.getName());}catch(Exception e){}}
输出
{"id":1,"name":"name-1"}1name-1