Java-Json字符串和类的相互转换,Json 字符串属性值获取

2019年11月28日 16:27 · 阅读(808) ·

目标

实现 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 引用

  1. <properties>
  2. <fastjson.version>1.2.38</fastjson.version>
  3. <gson.version>2.8.5</gson.version>
  4. </properties>
  5. <dependencies>
  6. <!--Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库-->
  7. <dependency>
  8. <groupId>com.alibaba</groupId>
  9. <artifactId>fastjson</artifactId>
  10. <version>${fastjson.version}</version>
  11. </dependency>
  12. <!-- 用于日志切面中,以 json 格式打印出入参(本来使用阿里的 FASTJSON, 但是对于文件上传的接口,打印参数会报错,换为 Gson) -->
  13. <dependency>
  14. <groupId>com.google.code.gson</groupId>
  15. <artifactId>gson</artifactId>
  16. <version>${gson.version}</version>
  17. </dependency>
  18. </dependencies>
  19. </dependencies>

代码

1.测试类

  1. package com.test.invoice.data;
  2. import com.alibaba.fastjson.annotation.JSONField;
  3. import io.swagger.annotations.ApiModelProperty;
  4. import lombok.Data;
  5. import lombok.experimental.Accessors;
  6. /**
  7. * TRbtTestData 参数类
  8. *
  9. * @author:
  10. * @version:
  11. * @date: 2019-08-09 08:57
  12. */
  13. @Data
  14. @Accessors(chain = true) //@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。
  15. public class TRbtTestData {
  16. @ApiModelProperty("id")
  17. @JSONField(name = "id")
  18. private String id;
  19. @ApiModelProperty("名称")
  20. @JSONField(name = "name")
  21. private String name;
  22. @ApiModelProperty("版本号")
  23. @JSONField(name = "version")
  24. private String version;
  25. }

2.转换代码

  1. /**
  2. * ClassToJson
  3. * @param data TRbtTestData
  4. * @param convertType 1:使用 GSON 转换,2:使用 alibaba.fastjson 转换
  5. * @return JsonString
  6. */
  7. @PostMapping("/Test/ClassToJson")
  8. @ApiOperation(value = "类转 Json",httpMethod = "POST",response = ResponseVO.class,notes="类转 Json")
  9. public ResponseVO ClassToJson(@RequestBody TRbtTestData data,@RequestParam(value="convertType",required = true) String convertType)
  10. {
  11. ResponseVO responseVO = new ResponseVO<String>();
  12. if (convertType.equals("1")){
  13. GsonBuilder builder = new GsonBuilder();
  14. Gson gson = builder.create();
  15. responseVO.setData(gson.toJson(data));
  16. }else if (convertType.equals("2")){
  17. responseVO.setData(JSON.toJSONString(data));
  18. }
  19. responseVO.setCode(ResponseCode.OK.value());
  20. return responseVO;
  21. }
  22. /**
  23. * JsonToClass
  24. * @param data String
  25. * @param convertType 1:使用 GSON 转换,2:使用 alibaba.fastjson 转换
  26. * @return Class
  27. */
  28. @PostMapping("/Test/JsonToClass")
  29. @ApiOperation(value = "Json 转类",httpMethod = "POST",response = ResponseVO.class,notes="Json 转类")
  30. public ResponseVO JsonToClass(@RequestBody String data,@RequestParam(value = "convertType",required = true) String convertType){
  31. ResponseVO responseVO = new ResponseVO<TRbtTestData>();
  32. if (convertType.equals("1")){
  33. GsonBuilder builder = new GsonBuilder();
  34. Gson gson = builder.create();
  35. responseVO.setData(gson.fromJson(data,TRbtTestData.class));
  36. }else if (convertType.equals("2")){
  37. responseVO.setData(JSON.parseObject(data,TRbtTestData.class));
  38. }
  39. responseVO.setCode(ResponseCode.OK.value());
  40. return responseVO;
  41. }

测试

1.类转 Json

2.Json 转换为类

扩展-Json 转 List 对象

  1. String jsonStr = configService.get("bg_list").getSysValue();
  2. List<ListVO> listData = JSON.parseArray(jsonStr,ListVO.class);

获取 Json 字符串中指定的属性值

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.fastjson.JSONPath;
  4. public static void main(String[] args){
  5. String data_toKenCompanyInfoVo="{\"accountNo\":\"000001\",\"openId\":\"000002\"}";
  6. JSONObject jsonObject = JSON.parseObject(data_toKenCompanyInfoVo);
  7. String accountNo = JSONPath.eval(jsonObject,"$.accountNo").toString();
  8. String openId = JSONPath.eval(jsonObject,"openId").toString();
  9. log.info("accountNo:"+accountNo);
  10. log.info("openId:"+openId);
  11. }

输出

  1. accountNo000001
  2. openId000002

使用 ObjectMapper

  1. //对象转json字符串
  2. public static String convertToJson(Object obj, boolean enableNull) {
  3. ObjectMapper mapperJson = new ObjectMapper();
  4. //mapperJson.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  5. //mapperJson.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);
  6. if (!enableNull) {
  7. mapperJson.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
  8. }
  9. SerializationConfig config = mapperJson.getSerializationConfig().without(
  10. MapperFeature.AUTO_DETECT_CREATORS,
  11. MapperFeature.AUTO_DETECT_SETTERS,
  12. MapperFeature.AUTO_DETECT_GETTERS,
  13. MapperFeature.AUTO_DETECT_IS_GETTERS);
  14. mapperJson.setConfig(config);
  15. mapperJson.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
  16. String dataJson = null;
  17. try {
  18. dataJson = mapperJson.writeValueAsString(obj);
  19. } catch (JsonProcessingException e) {
  20. e.printStackTrace();
  21. }
  22. return dataJson;
  23. }
  24. //json 转对象
  25. public static <T> T convertToObject(String json, TypeReference<T> typeRef, boolean isHaveTime) {
  26. T t = null;
  27. try {
  28. ObjectMapper objectMapper = new ObjectMapper();
  29. String pattern = "yyyy/MM/dd";
  30. if (isHaveTime) {
  31. pattern = "yyyy/MM/dd HH:mm:ss";
  32. }
  33. objectMapper.setDateFormat(new SimpleDateFormat(pattern));
  34. //解决反序列化时json字段比实体字段多的问题
  35. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  36. //忽略大小写
  37. objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
  38. t = objectMapper.readValue(json, typeRef);
  39. } catch (Exception e) {
  40. log.error("convertToObject >>> deserialize fail:", e);
  41. }
  42. return t;
  43. }
  44. @Data
  45. public static class Student{
  46. private Integer id;
  47. private String name;
  48. }
  49. public static void main(String[] args) {
  50. try{
  51. Student student = new Student();
  52. student.setId(1);
  53. student.setName("name-1");
  54. String json = convertToJson(student,false);
  55. System.out.println(json);
  56. Student student1 = convertToObject(json, new TypeReference<Student>() {},true);
  57. System.out.println(student1.getId());
  58. System.out.println(student1.getName());
  59. }catch(Exception e){}
  60. }

输出

  1. {"id":1,"name":"name-1"}
  2. 1
  3. name-1