[实践总结] Json 和 JavaObject 互相转换


Maven依赖

<!--Json相关-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.15.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.15.1</version>
</dependency>
<!--new ObjectMapper()-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.1</version>
</dependency>

<!-- 引入第三方组件对JSON做验证, 调用JsonSanitizer.sanitize()进行校验,防止JSON注入-->
<dependency>
    <groupId>com.mikesamuel</groupId>
    <artifactId>json-sanitizer</artifactId>
    <version>1.2.3</version>
</dependency>

<!-- GSON-->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

引入第三方组件对 JSON 做验证, 调用 JsonSanitizer.sanitize() 进行校验
在这里插入图片描述


序列化(jackson Java Object to JSON)

常用用法

public static <T> String toJson(T object) {
    ObjectMapper objectMapper = new ObjectMapper();
    
    String jsonStr = null;
    
    try {
        jsonStr = objectMapper.writeValueAsString(object);
    } catch (JsonProcessingException e) {
        log.info("occur error:{}", e.getMessage());
    }
    
    return jsonStr;
}

使用:
String json = JsonUtils.toJson(person); :{"id":1,"name":"name","age":18,"nickName":null}
String json = JsonUtils.toJson(map);:{"name":"name","id":1,"age":18}

定制化用法:例如过滤值为null的,属性使用蛇形命名

public static <T> String toJsonNonNullSnake(T object) {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
    
    String jsonStr = null;
    
    try {
        jsonStr = objectMapper.writeValueAsString(object);
    } catch (JsonProcessingException e) {
        log.info("occur error:{}", e.getMessage());
    }
    
    return jsonStr;
}

使用:
String json = JsonUtils.toJsonNonNullSnake(person);:{"id":1,"name":"name","nick_name":"nickName"}
String json = JsonUtils.toJsonNonNullSnake(map);:{"id":1,"name":"name","nick_name":"nickName"}

转成Json串后写入文件

// toJson 然后写入文件里
public static <T> void toJsonFile(T object) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        // 前提文件必须存在,其次是文件内容全覆盖的方式写入
        objectMapper.writeValue(new File("D:/output/car.json"), object);
    } catch (IOException e) {
        log.info("occur error:{}", e.getMessage());
    }
}

在这里插入图片描述

序列化(Gson Java Object to JSON)

可定制化用法

public static <T> String toJson2(T object) {
    Gson gson = new GsonBuilder()
    		.setLenient()// json宽松,来忽略一些不标准的 JSON 数据格式
            .enableComplexMapKeySerialization()//支持Map的key为复杂对象的形式
            .serializeNulls() //智能null
            .setPrettyPrinting() // 美化格式
            .disableHtmlEscaping() //默认是GSON把HTML转义的
            .create();
            
    return gson.toJson(object);
}

使用:
String json = JsonUtils.toJsonG(person);:{"id":1,"name":"name","age":null,"nickName":"nickName"}
String json = JsonUtils.toJsonG(map);:{"name":"name","id":1,"age":18}

反序列化(jackson Json to Java Object)

常用用法

/**
 * 将JSON字符串转换为指定类型的对象
 *
 * @param jsonStr 需要转换的JSON格式字符串
 * @param clazz 目标类型对应的Class对象
 * @param <T> 泛型参数,表示目标类型
 * @return 转换成功返回对应类型的实例,若jsonStr为空或转换失败,则返回null
 */
public static <T> T jsonToT(String jsonStr, Class<T> clazz) {
    if (StringUtils.isBlank(jsonStr)) {
        return null;
    }
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        // 使用JsonSanitizer对JSON字符串进行处理后,再进行反序列化
        return objectMapper.readValue(JsonSanitizer.sanitize(jsonStr), clazz);
    } catch (JsonProcessingException e) {
        // 记录更详细的日志信息
        log.error("JSON processing error: {}", e.getClass().getName());
        log.error("JSON String: {}", jsonStr);
        log.error("Error Message: {}", e.getMessage());
        return null;
    }
}

Person person = JsonUtils.jsonToT(json, Person.class); 
结果: JsonUtilsTest.Person(id=1, name=name, age=18, nickName=null)
Map map = JsonUtils.jsonToT(json, Map.class); 
结果: {id=1, name=name, age=18}

定制化用法

public static <T> T jsonToTNonNullSnake(String json, Class<T> clazz) {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 跳过Json里不认识字段
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // JSON串里值为null的属性不处理
    objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); // 识别JSON里的蛇形命名的属性
    
    T t = null;
    
    try {
        t = objectMapper.readValue(JsonSanitizer.sanitize(json), clazz);
    } catch (JsonProcessingException e) {
        log.info("occur error:{}", e.getMessage());
    }
    
    return t;
}

Person person = JsonUtils.jsonToTNonNullSnake(json, Person.class);JsonUtilsTest.Person(id=1, name=name, age=null, nickName=nickName)

读取json文件到Java Object

public static <T> T jsonFileToT(Class<T> clazz) {
    ObjectMapper objectMapper = new ObjectMapper();
    T t = null;
    try {
        t = objectMapper.readValue(new URL("file:D:/output/car.json"), clazz);
        t = objectMapper.readValue(new File("file:D:/output/car.json"), clazz);
    } catch (IOException e) {
        log.info("occur error:{}", e.getMessage());
    }
    return t;

结果都为:
URL : JsonUtilsTest.Person(id=1, name=name, age=18, nickName=null)
File : JsonUtilsTest.Person(id=1, name=name, age=18, nickName=null)

jackson json to JsonNode

public static JsonNode jsonToJsonNode(String json) {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = null;
    try {
        jsonNode = objectMapper.readTree(json);
    } catch (JsonProcessingException e) {
        log.info("occur error:{}", e.getMessage());
    }
    return jsonNode;
}

Map<String, List<String>> map = new HashMap<>();
map.put("name", Arrays.asList("name1", "name2", "name3"));
map.put("age", Arrays.asList("11", "23", "23"));
map.put("num", Arrays.asList("123", "234", "345"));
String json1 = JsonUtils.toJson(map);

JsonNode jsonNode = JsonUtils.jsonToJsonNode(JsonUtils.toJson(map));
JsonNode list = jsonNode.get("name");
JsonNode str = list.get(0);

结果:
{"num":["123","234","345"],"name":["name1","name2","name3"],"age":["11","23","23"]}
["name1","name2","name3"]
"name1"

jackson Json to List:实现方式1

// json to List
public static <T> List<T> jsonToList(String json, Class<T> clazz) {
    ObjectMapper objectMapper = new ObjectMapper();
    List<T> list = new ArrayList<>();
    try {
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, clazz);
        list.add(objectMapper.readValue(JsonSanitizer.sanitize(json), javaType));
    } catch (JsonProcessingException e) {
        log.info("occur error:{}", e.getMessage());
    }
    return list;
}

List<Person> people = JsonUtils.jsonToList(json, Person.class);

//Json
{"id":1,"name":"name1","age":13,"nickName":"nickName"},{"id":2,"name":"name2","age":14,"nickName":"nickName2"}
//json to List<Person>
[[JsonUtilsTest.Person(id=1, name=name1, age=13, nickName=nickName), JsonUtilsTest.Person(id=2, name=name2, age=14, nickName=nickName2)]]

jackson Json to List:实现方式2

public static <T> List<T> jsonToList2(String json) {
    ObjectMapper objectMapper = new ObjectMapper();
    List<T> list = new ArrayList<>();
    try {
        list = objectMapper.readValue(json, new TypeReference<List<T>>() {});
    } catch (JsonProcessingException e) {
        log.info("occur error:{}", e.getMessage());
    }
    return list;
}

List<Person> people = JsonUtils.jsonToList2(json);

//Json
[{"id":1,"name":"name1","age":13,"nickName":"nickName"},{"id":2,"name":"name2","age":14,"nickName":"nickName2"}]
//json to List<Person>
[{id=1, name=name1, age=13, nickName=nickName}, {id=2, name=name2, age=14, nickName=nickName2}]

jackson Json to Map

public static Map<String, Object> jsonToMap(String json) {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> map = new HashMap();
    try {
        map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});
    } catch (JsonProcessingException e) {
        log.info("occur error:{}", e.getMessage());
    }
    return map;
}

Map<String, Object> people = JsonUtils.jsonToMap(json);

//Json
{"num":"num1","name":"name1","age":"age1"}
//json to Map<String, Object>
{num=num1, name=name1, age=age1}

反序列化(Gson Json to Java Object)

定制化用法

public static <T> T jsonToTG(String json, Class<T> clazz) {
    Gson gson = new GsonBuilder()
    		.setLenient()// json宽松
            .enableComplexMapKeySerialization()//支持Map的key为复杂对象的形式
            .serializeNulls() //智能null
            .setPrettyPrinting()// 美化格式
            .disableHtmlEscaping() //默认是GSON把HTML转义的
            .create();
            
    return gson.fromJson(Normalizer.normalize(JsonSanitizer.sanitize(json), Normalizer.Form.NFC), clazz);
}

Person person = JsonUtils.jsonToTG(json, Person.class);JsonUtilsTest.Person(id=1, name=name, age=null, nickName=null)

安全

JSON Injection

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值