目标
实现 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:000001
openId: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;
}
@Data
public 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"}
1
name-1