您的位置:

Hutool Json转Map详细解析

一、常规用法

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": "这个工具还有哪些好玩的?"
        }
    ]
}

这里有几个需要注意的点:

  1. Json数据中有嵌套的Map、Object、List等类型
  2. 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数据的处理效率。