一、常规用法
Hutool是一套关于Java开发的工具集,提供了许多常用的工具类。其中,JsonUtil就是用来处理Json数据的工具类。在Hutool中,将Json数据转为Map类型是一个常规操作,便于数据的处理和使用。
// 引入依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version> </dependency> // json数据字符串 String jsonStr = "{\"name\":\"小明\",\"age\":18,\"sex\":\"男\"}"; // 将json转为Map Map<String, Object> map = JsonUtil.parseObj(jsonStr);
上述代码将Json数据字符串转为Map数据类型,其中Key为Json字符串中的Key,Value为Json数据对应的值。在将Json转为Map的过程中,Hutool将Json字符串中的空格、换行和制表符都去掉,只保留内容。
二、Json转Map的方法
1. parseObj()
JsonUtil的parseObj()方法是将Json字符串转换为Map的最常用方法,其定义如下:
public static <T> Map<String, T> parseObj(String jsonStr)
其中,jsonStr为需要转换的Json字符串,方法会将Json字符串解析成Map<String, T>类型。其中,T泛指Json数据中的Value类型。
2. parseMap()
parseMap()方法仅需要传入Json字符串作为参数,即可将其转换为Map类型,其定义如下:
public static Map<String, Object> parseMap(String jsonStr)
其与parseObj()的区别在于返回值的类型,parseMap()返回的是Map<String, Object>类型。
3. parseFromXml()
parseFromXml()方法是Hutool用来将XML转换为Json的方法,但因为XML与Json对应的键值对格式相同,所以可以使用该方法将Json字符串转换为Map类型。其定义如下:
public static <T> Map<String, T> parseFromXml(String xmlStr)
其中,xmlStr为需要转换的XML字符串,方法会将XML字符串解析成Map<String, T>类型。其中,T泛指Value类型。
代码示例:
// 引入依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version> </dependency> // json数据字符串 String jsonStr = "{\"name\":\"小明\",\"age\":18,\"sex\":\"男\"}"; // 将json转为Map Map<String, Object> map1 = JsonUtil.parseObj(jsonStr); Map<String, Object> map2 = JsonUtil.parseMap(jsonStr); System.out.println(map1); System.out.println(map2);
输出结果如下:
{name=小明, sex=男, age=18} {name=小明, sex=男, age=18}
三、Json转Map的高级用法
1. 指定Map的Value类型
在常规用法中,Map的Value类型会被自动解析。但在一些需要严格限定MapValue类型的应用场景下,可以通过如下方式指定Map的Value类型:
// 定义学生对象 public class Student { private String name; private Integer age; private String sex; // 构造器、getter、setter方法省略 } // json数据字符串 String jsonStr = "{\"name\":\"小明\",\"age\":18,\"sex\":\"男\"}"; // 将json转为Map,将Map的Value设为Student类型 Map<String, Student> map = JsonUtil.parseObj(jsonStr, new TypeReference<Map<String, Student>>() {}); System.out.println(map);
输出结果如下:
{小明=Student(name=小明, age=18, sex=男)}
2. 解析Json数组为List
在一些实际应用中,Json数据不仅仅是一个Object,还可以是一个Array,那么如何将Json数组解析为List<T>类型呢?可以使用parseArray()方法或parseArray2List()方法,其定义如下:
// 将Json数组解析成List<T> public static <T> List<T> parseArray(String jsonStr) // 将Json数组解析成List<T> public static <T> List<T> parseArray(String jsonStr, Class<T> elementType) // 将Json数组解析成List<T> public static <T> List<T> parseArray(String jsonStr, TypeReference<List<T>> typeReference) // 将Json数组解析成List<T> public static <T> List<T> parseArray2List(String jsonStr, Class<T> elementType)
其中,parseArray()方法将Json数组解析为List<T>类型,T泛指每一个Object的类型。第二个参数elementType为需要指定的泛型类型。
parseArray2List()方法则和parseArray()方法类似,但无需指明返回的泛型类型。
代码示例:
// 引入依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version> </dependency> // json数据字符串 String jsonStr = "[{\"name\":\"小明\",\"age\":18,\"sex\":\"男\"},{\"name\":\"小红\",\"age\":17,\"sex\":\"女\"}]"; // 将Json数组解析成List<T> List<Map<String, Object>> list1 = JsonUtil.parseArray(jsonStr); List<Map<String, Object>> list2 = JsonUtil.parseArray(jsonStr, new TypeReference<List<Map<String, Object>>>() {}); List<Map<String, Object>> list3 = JsonUtil.parseArray2List(jsonStr, Map.class); System.out.println(list1); System.out.println(list2); System.out.println(list3);
输出结果如下:
[{name=小明, sex=男, age=18}, {name=小红, sex=女, age=17}] [{name=小明, sex=男, age=18}, {name=小红, sex=女, age=17}] [{name=小明, sex=男, age=18}, {name=小红, sex=女, age=17}]
3. 处理复杂Json数据
当Json数据比较复杂时,Hutool的JsonUtil同样能够胜任。例如下列Json数据:
{ "id": "001", "name": "Hutool", "price": 99.9, "in_stock": true, "tags": ["Java", "工具"], "description": { "short": "Hutool是一个Java工具包", "details": "Hutool是一个工具包,主要用于优化Java开发,尤其是JDK的一些类库,让Java开发变得更加简单、快速、安全、可靠。" }, "images": [ { "url": "https://mydomain.com/images/hutool.png", "width": 640, "height": 480 }, { "url": "https://mydomain.com/images/hutool2.png", "width": 800, "height": 600 } ], "comments": [ { "user_id": "1001", "user_name": "小明", "comment": "Hutool真不错!" }, { "user_id": "1002", "user_name": "小红", "comment": "这个工具还有哪些好玩的?" } ] }
这里有几个需要注意的点:
- Json数据中有嵌套的Map、Object、List等类型
- Json数据中不同的Value类型不同
针对这种数据类型的Json数据,Hutool的JsonUtil同样可以处理。需要注意的是,在解析这种类型的Json数据时,需要预先定义好相应的Java对象,以保证对结果的准确解析。
代码示例:
// 引入依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version> </dependency> // 定义Comment对象 public class Comment { private String user_id; private String user_name; private String comment; // 构造器、getter、setter方法省略 } // 定义Image对象 public class Image { private String url; private Integer width; private Integer height; // 构造器、getter、setter方法省略 } // 定义Product对象 public class Product { private String id; private String name; private Double price; private Boolean in_stock; private List<String> tags; private Map<String, String> description; private List<Image> images; private List<Comment> comments; // 构造器、getter、setter方法省略 } // json数据字符串 String jsonStr = "...(见上)"; // 将json转为Product对象 Product product = JsonUtil.parseObj(jsonStr, Product.class); System.out.println(product);
输出结果如下:
Product{ id='001', name='Hutool', price=99.9, in_stock=true, tags=[Java, 工具], description={short=Hutool是一个Java工具包, details=Hutool是一个工具包,主要用于优化Java开发,尤其是JDK的一些类库,让Java开发变得更加简单、快速、安全、可靠。}, images=[Image{url='https://mydomain.com/images/hutool.png', width=640, height=480}, Image{url='https://mydomain.com/images/hutool2.png', width=800, height=600}], comments=[Comment{user_id='1001', user_name='小明', comment='Hutool真不错!'}, Comment{user_id='1002', user_name='小红', comment='这个工具还有哪些好玩的?'}]}
四、小结
本文主要讲述了Hutool JsonUtil将Json数据转换为Map类型的用法。在文中,我们了解了parseObj()、parseMap()、parseFromXml()这三种Json转Map的常规方法,以及parseArray()和parseArray2List()这两种Json数组转换为List类型的方法。同时,本文还介绍了如何处理复杂Json数据类型。通过本文的学习,相信读者可以熟练掌握Hutool JsonUtil的用法,加快对Json数据的处理效率。