阅读 338

几种常见的Json工具包

概述

作为 面向对象 开发的程序员,每天的业务代码会遇到大量的 Json 处理。本文从最常见的几个类库 gson, fastjson, jackson 进行基本操作, 仅作记录。

基础准备

首先创建 java 对象用于测试

角色

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-10
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role {

    private String roleName;

}
复制代码

这里我们创建一个复合嵌套对象 user

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-10
 */
@Data
public class User {

    private String userName;
    private List<Role> roles;
}
复制代码

用户组

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-11
 */
@Data
public class UserGroup implements Serializable {

    private String groupName;
    private Map<String, User> idNumber;

}
复制代码

菜单

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-10
 */
@Data
@AllArgsConstructor
public class Menu {

    @SerializedName("menu_name")
    private String menuName;

}
复制代码

部门

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-11
 */
@Data
@AllArgsConstructor
public class Dept {
    private String deptName;
}
复制代码

类型适配器

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-11
 */
public class DeptAdapter implements JsonSerializer<Dept> {

    @Override
    public JsonElement serialize(Dept dept, Type type, JsonSerializationContext jsonSerializationContext) {

        JsonObject deptObject = new JsonObject();
        deptObject.addProperty("dept_name", dept.getDeptName());

        return deptObject;
    }
}
复制代码

Gson

maven 依赖

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>
复制代码

单元测试

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-10
 */
class GsonTest {

    /**
     * {"userName":"admin","roles":[{"roleName":"系统管理员"},{"roleName":"普通管理员"}]}
     */
    @Test
    void toJson() {
        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");
        User user = new User();
        user.setUserName("admin");
        user.setRoles(Arrays.asList(role1, role2));

        // 对象转json
        String json = new Gson().toJson(user);
        System.out.println(json);
    }

    /**
     * {"userName":"admin","roles":[{"roleName":"系统管理员"},{"roleName":"普通管理员"}]}
     */
    @Test
    void toJson2() {
        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");
        User user = new User();
        user.setUserName("admin");
        user.setRoles(Arrays.asList(role1, role2));

        String json = new GsonBuilder().create().toJson(user);
        System.out.println(json);
    }

    /**
     * User(userName=admin, roles=[Role(roleName=系统管理员), Role(roleName=普通管理员)])
     */
    @Test
    void fromJson() {
        String json = "{\"userName\":\"admin\",\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]}";
        User user = new Gson().fromJson(json, User.class);
        System.out.println(user);
    }

    /**
     * admin
     * {"userName":"admin","roles":{"roleName":"超级管理员"}}
     */
    @Test
    void createJsonObject() {

        JsonObject role = new JsonObject();
        role.addProperty("roleName", "超级管理员");

        JsonObject user = new JsonObject();
        user.addProperty("userName", "admin");
        user.add("roles", role);

        String username = user.get("userName").getAsString();
        System.out.println(username);
        System.out.println(user);
    }

    /**
     * admin
     */
    @Test
    void json2Object() {

        String json = "{\"userName\":\"admin\",\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]}";

        JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject();
        String userName = jsonObject.get("userName").getAsString();
        System.out.println(userName);
    }


    /**
     * [{"roleName":"系统管理员"},{"roleName":"普通管理员"}]
     */
    @Test
    void list2Json() {

        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");
        String json = new Gson().toJson(Arrays.asList(role1, role2));

        System.out.println(json);
    }

    /**
     * [Role(roleName=系统管理员), Role(roleName=普通管理员)]
     */
    @Test
    void json2List() {
        String json = "[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]";
        List<Role> roles = new Gson().fromJson(json, new TypeToken<List<Role>>() {}.getType());

        System.out.println(roles);
    }

    /**
     * [{"roleName":"系统管理员"},{"roleName":"普通管理员"}]
     */
    @Test
    void json2Array() {
        String json = "[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]";
        JsonArray jsonArray = JsonParser.parseString(json).getAsJsonArray();

        System.out.println(jsonArray);
    }

    /**
     * {"userName":"admin"}
     */
    @Test
    void map2Json() {
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("userName", "admin");

        String json = new Gson().toJson(hashMap);
        System.out.println(json);
    }

    /**
     * admin
     */
    @Test
    void json2Map() {
        String json = "{\"userName\":\"admin\"}";
        HashMap hashMap = new Gson().fromJson(json, new TypeToken<HashMap<String, String>>() {}.getType());

        System.out.println(hashMap.get("userName"));
    }


    /**
     * 默认的字段转换规则,字段名不变
     * {"roleName":"超级管理员"}
     */
    @Test
    void setFieldNamingPolicy1() {

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
                .create();

        Role role = new Role("超级管理员");
        String json = gson.toJson(role);
        System.out.println(json);
    }

    /**
     * 将json中的字段名转换为首字母大写的格式
     * {"RoleName":"超级管理员"}
     */
    @Test
    void setFieldNamingPolicy2() {

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .create();

        Role role = new Role("超级管理员");
        String json = gson.toJson(role);
        System.out.println(json);
    }

    /**
     * 将json中的字段名转换为首字母大写,单词之间以空格分割的格式
     * {"Role Name":"超级管理员"}
     */
    @Test
    void setFieldNamingPolicy3() {

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES)
                .create();

        Role role = new Role("超级管理员");
        String json = gson.toJson(role);
        System.out.println(json);
    }

    /**
     * 将json中的字段名转换为小写字母,单词之间以下划线分割的格式
     * {"role_name":"超级管理员"}
     */
    @Test
    void setFieldNamingPolicy4() {

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .create();

        Role role = new Role("超级管理员");
        String json = gson.toJson(role);
        System.out.println(json);
    }

    /**
     * 将json中的字段名转换为小写字母,单词之间以分隔线分割的格式
     * {"role-name":"超级管理员"}
     */
    @Test
    void setFieldNamingPolicy5() {

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
                .create();

        Role role = new Role("超级管理员");
        String json = gson.toJson(role);
        System.out.println(json);
    }

    /**
     * 将json中的字段名转换为小写字母,单词之间以点分割的格式
     * {"role.name":"超级管理员"}
     */
    @Test
    void setFieldNamingPolicy6() {

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DOTS)
                .create();

        Role role = new Role("超级管理员");
        String json = gson.toJson(role);
        System.out.println(json);
    }

    /**
     * 属性重命名
     * {"menu_name":"系统管理"}
     */
    @Test
    void serializedName() {
        Menu menu = new Menu("系统管理");

        String json = new Gson().toJson(menu);
        System.out.println(json);
    }

    /**
     * {"dept_name":"产品研发部"}
     */
    @Test
    void adapter() {
        Gson gson = new GsonBuilder()
                //为Dept注册TypeAdapter
                .registerTypeAdapter(Dept.class, new DeptAdapter())
                .create();

        Dept dept = new Dept("产品研发部");
        String json = gson.toJson(dept);

        System.out.println(json);
    }

}
复制代码

FastJson

maven 依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>
复制代码

单元测试

public class FastJsonTest {

    /**
     * {"roles":[{"roleName":"系统管理员"},{"roleName":"普通管理员"}],"userName":"admin"}
     */
    @Test
    void toJson() {
        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");
        User user = new User();
        user.setUserName("admin");
        user.setRoles(Arrays.asList(role1, role2));

        String userJson = JSON.toJSONString(user);
        System.out.println(userJson);
    }

    /**
     * admin
     * {"roles":[{"roleName":"系统管理员"},{"roleName":"普通管理员"}],"userName":"admin"}
     */
    @Test
    void jsonParse() {
        String json = "{\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}],\"userName\":\"admin\"}";
        JSONObject jsonObject = JSON.parseObject(json);

        System.out.println(jsonObject.getString("userName"));
        System.out.println(jsonObject);
    }

    /**
     * [{"roleName":"系统管理员"},{"roleName":"普通管理员"}]
     */
    @Test
    void list2Json() {
        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");

        String jsonString = JSON.toJSONString(Arrays.asList(role1, role2));

        System.out.println(jsonString);
    }

    /**
     * [{"roleName":"系统管理员"},{"roleName":"普通管理员"}]
     */
    @Test
    void json2List() {
        String json = "[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]";

        JSONArray jsonArray = JSON.parseArray(json);
        System.out.println(jsonArray);
    }

    /**
     * [Role(roleName=系统管理员), Role(roleName=普通管理员)]
     */
    @Test
    void json2List2() {
        String json = "[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]";

        List<Role> users = JSON.parseArray(json, Role.class);
        System.out.println(users);
    }

    /**
     * User(userName=admin, roles=[Role(roleName=系统管理员), Role(roleName=普通管理员)])
     */
    @Test
    void json2Bean() {
        String json = "{\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}],\"userName\":\"admin\"}";

        User user = JSON.parseObject(json, User.class);
        System.out.println(user);
    }

    /**
     * User(userName=admin, roles=[Role(roleName=系统管理员), Role(roleName=普通管理员)])
     */
    @Test
    void json2Bean2() {
        String json = "{\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}],\"userName\":\"admin\"}";

        User user = JSON.parseObject(json, new TypeReference<User>(){});
        System.out.println(user);
    }

    /**
     * {"userName":"admin"}
     */
    @Test
    void map2Json() {
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("userName", "admin");

        String jsonString = JSON.toJSONString(hashMap);
        System.out.println(jsonString);
    }

    /**
     * admin
     */
    @Test
    void json2Map() {
        String json = "{\"userName\":\"admin\"}";

        Map<String, String> map = (Map<String, String>) JSON.parse(json);
        System.out.println(map.get("userName"));
    }

    /**
     * {"userName":"admin"}
     */
    @Test
    void json2Map2() {
        String json = "{\"userName\":\"admin\"}";

        Map map = JSON.parseObject(json);
        System.out.println(map);
    }

    /**
     * {"groupName":"分组1","idNumber":{"001":{"roles":[{"roleName":"系统管理员"},{"roleName":"普通管理员"}],"userName":"admin"}}}
     */
    @Test
    void obj2Json() {
        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");
        User user = new User();
        user.setUserName("admin");
        user.setRoles(Arrays.asList(role1, role2));

        HashMap<String, User> map = new HashMap<>();
        map.put("001", user);
        UserGroup userGroup = new UserGroup();
        userGroup.setGroupName("分组1");
        userGroup.setIdNumber(map);

        String jsonString = JSON.toJSONString(userGroup);
        System.out.println(jsonString);
    }

    /**
     * UserGroup(groupName=分组1, idNumber={001=User(userName=admin, roles=[Role(roleName=系统管理员), Role(roleName=普通管理员)])})
     */
    @Test
    void json2Obj() {
        String json = "{\"groupName\":\"分组1\",\"idNumber\":{\"001\":{\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}],\"userName\":\"admin\"}}}";

        UserGroup userGroup = JSON.parseObject(json, UserGroup.class);
        System.out.println(userGroup);
    }

}
复制代码

Jackson

单元测试

/**
 * @author 当我遇上你
 * @公众号 当我遇上你
 * @since 2020-06-11
 */
public class JacksonTest {

    /**
     * {"userName":"admin","roles":[{"roleName":"系统管理员"},{"roleName":"普通管理员"}]}
     * @throws JsonProcessingException
     */
    @Test
    void Obj2Json() throws JsonProcessingException {
        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");
        User user = new User();
        user.setUserName("admin");
        user.setRoles(Arrays.asList(role1, role2));

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);

        System.out.println(json);
    }

    /**
     * 需要无参构造方法
     * User(userName=admin, roles=[Role(roleName=系统管理员), Role(roleName=普通管理员)])
     * @throws JsonProcessingException
     */
    @Test
    void json2Obj() throws JsonProcessingException {
        String json = "{\"userName\":\"admin\",\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]}";

        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user);
    }

    /**
     * admin
     * @throws JsonProcessingException
     */
    @Test
    void json2Obj2() throws JsonProcessingException {
        String json = "{\"userName\":\"admin\",\"roles\":[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]}";

        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonNode = mapper.readTree(json);

        String userName = jsonNode.get("userName").asText();
        System.out.println(userName);
    }

    /**
     * [{"roleName":"系统管理员"},{"roleName":"普通管理员"}]
     * @throws JsonProcessingException
     */
    @Test
    void list2Json() throws JsonProcessingException {
        Role role1 = new Role("系统管理员");
        Role role2 = new Role("普通管理员");

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(Arrays.asList(role1, role2));

        System.out.println(json);
    }

    /**
     * 需要无参构造方法
     * [Role(roleName=系统管理员), Role(roleName=普通管理员)]
     * @throws JsonProcessingException
     */
    @Test
    void json2List() throws JsonProcessingException {
        String json = "[{\"roleName\":\"系统管理员\"},{\"roleName\":\"普通管理员\"}]";

        ObjectMapper mapper = new ObjectMapper();
        List<Role> roles = mapper.readValue(json, new TypeReference<List<Role>>() {
        });

        System.out.println(roles);
    }
}
复制代码

最后

本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】,您的支持是我写作的最大动力。