基于原生 JSON 封装解析与生成工具

本贴最后更新于 2767 天前,其中的信息可能已经时过境迁

将 JavaBean 封装成 JSON 格式的字符串

封装 JSON 数据的代码片段

     List listUser = new ArrayList<>(); //创建一个List集合
    
     Map mapUser = new HashMap<>(); //创建一个Map集合
    
     mapUser.put("map-key", new UserBean(4, "map-1", 10, 2.456789, null,null, null)); //添加一个map的元素
    
     listUser.add(new UserBean(3, "list-1", 17, 1.456, null, null, null));//添加一个list的元素
    
     UserBean[] arrayUser = { new UserBean(2, "array-1", 16, 10.0123456,null, null, null) }; //创建一个对象数组并添加一个元素
    
     UserBean us = new UserBean(1, "大白", 18, 3.230, listUser, mapUser,arrayUser); //将list map 对象数组 都设置到JavaBean当中
    
     Pson pson = Pson.Instance(); //初始化工具类
     /**
      * 使用工具进行封装JavaBean中的所有字段
      */
     String jsonStr = pson.objectToJson(us);
     System.out.println(jsonStr);
     /**
      * 使用工具进行封装JavaBean中的ID 与名字
      */
     jsonStr = pson.objectToJson(us,"id","name");
     System.out.println(jsonStr);

封装 JSON 格式后的数据

//封装所有的字段
{"id":1,"name":"大白","age":18,"money":3.23,"listUser":[{"id":3,"name":"list-1","age":17,"money":1.456}],"mapUser":{"map-key":{"id":4,"name":"map-1","age":10,"money":2.456789}},"arrayUser":[{"id":2,"name":"array-1","age":16,"money":10.0123456}]}

//封装指定的字段
{"id":1,"name":"大白"}    

将 JSON 格式字符串解析成 Object 实体类

首先准备两个 JSON 格式的数据 一个为对象 一个为数组

JSON-1: String jsonStr = {"id":1,"name":"大白","age":18,"money":1.0453}

JSON-2: String jsonArray = [{"id":1,"name":"大白","age":18,"money":2.0453},{"id":1,"name":"大白","age":18,"money":1.0453}]

解析对象

    Pson pson = Pson.Instance();
    /**
     * 调用工具类进行解析 一参为被解析的类的class对象 二参为JSON格式的字符串数据
     */
    UserBean ub = pson.jsonToObject(UserBean.class, jsonStr);
    System.out.println(ub);
    
    //解析完毕后打印的ub对象
    UserBean [id=1, name=大白, age=18, money=1.0453, listUser=null, mapUser=null, arrayUser=null]

解析数组

    UserBean users[] = {}; // 首先先初始化一个空的数组
    users = pson.jsonToObject(users.getClass(), jsonArray);
    for (UserBean u : users) {
        System.out.println(u);
    }
    
    //解析完毕后打印的数组元素
    UserBean [id=1, name=大白1, age=18, money=1.0453, listUser=null, mapUser=null, arrayUser=null]
    UserBean [id=2, name=大白2, age=18, money=2.0453, listUser=null, mapUser=null, arrayUser=null]

JSON 工具类

使用工具类前需要有原生 org.json 包 前往下载

之前因为不太喜欢第三方的东西 虽然知道有 Gson 这类的第三方工具

所以自己动手写了一个工具

public class Pson {
    private String pattern = "yyyy-MM-dd HH:mm:ss";//时间格式

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }

    public static final Pson pson = new Pson();

    public static Pson Instance() {
        return pson;
    }

    private Pson() {
        
    }

    /**
     * 将对象 转换成JSON格式的字符串
     *
     * @param object    需要封装的对象
     * @param fieldName 需要封装的指定字段 如果为空 则封装所有字段
     * @return 返回封装后的JSON格式的字符串
     */
    public Object objectToJson(Object object, String... fieldName) {
        return ObjectToString(object, fieldName);
    }

    /**
     * 将对象 转换成JSON格式的字符串
     *
     * @param object
     * @param fieldName 需要封装指定的字段
     * @return 接收到之后 调用toString即可
     */
    private Object ObjectToString(Object object, String... fieldName) {
        if (object == null) {
            return null;
        } else if (object instanceof List) { // 判断是否是List集合
            List list = (List) object;
            JSONArray array = new JSONArray();
            if (list.size() != 0) {
                Object oneObject = list.get(0);// 先取出第一个元素 然后判断是否是基本数据类型
                // 或者String类型
                if (toBasicData(oneObject)) { // 元素是基本数据类型
                    for (Object element : list) {
                        array.put(element);
                    }
                } else {
                    for (Object element : list) {
                        array.put(ObjectToString(element, fieldName));
                    }
                }
            }
            return array;
        } else if (object.getClass().isArray()) {
            Object oArray[] = (Object[]) object;
            JSONArray jsonArray = new JSONArray();
            /**
             * 判断数组长度
             */
            if (oArray.length != 0) {
                if (toBasicData(oArray[0])) { // 判断数组的元素是基本数据 还是对象
                    for (Object elementObject : oArray) {
                        jsonArray.put(elementObject);
                    }
                } else {
                    for (Object elementObject : oArray) {
                        jsonArray.put(ObjectToString(elementObject, fieldName));
                    }
                }
            }
            return jsonArray;
        } else if (object instanceof Map) {
            Map map = (Map) object;
            Set> entries = map.entrySet();
            JSONObject jsonObject = new JSONObject();
            if (fieldName.length != 0) {//判断是否需要解析指定的字段
                for (String keyName :
                        fieldName) {
                    jsonPutMap(jsonObject, keyName, map.get(keyName), fieldName);
                }
            } else {
                /**
                 * 遍历MAP集合
                 */
                for (Map.Entry entry : entries) {
                    jsonPutMap(jsonObject, entry.getKey(), entry.getValue(), fieldName);
                }
            }
            return jsonObject;
        } else if (object instanceof Date) { //时间类
            return new SimpleDateFormat(pattern).format((Date) object);
        }
        JSONObject json = new JSONObject();
        Class c = object.getClass();
        Field fs[] = null;
        if (fieldName != null && fieldName.length != 0) { // 判断是否需要 取出指定的字段
            int len = fieldName.length;
            fs = new Field[len];
            int i = 0;
            for (String s : fieldName) {
                try {
                    fs[i] = c.getDeclaredField(s);
                } catch (NoSuchFieldException | SecurityException e) {
                    e.printStackTrace();
                }
                i++;
            }
        } else {
            fs = c.getDeclaredFields();
        }

        for (Field f : fs) {
            if (f == null)
                continue;
            f.setAccessible(true);
            try {
                Object o = f.get(object);
                if (o != null) { // 判断属性内容是否为空
                    if (toBasicData(o)) { // 判断是否是基本数据类型 或者是String类型
                        json.put(f.getName(), o);
                    } else { // 可能是一个JavaBean 或者是集合
                        json.put(f.getName(), ObjectToString(o, fieldName));
                    }
                } else {
                    json.put(f.getName(), o);
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return json;
    }

    /**
     * 判断是否是字符串 或者是 基本数据类型
     *
     * @param object
     * @return 基本数据类型|字符串类型 返回true
     */
    private boolean toBasicData(Object object) {
        if (object == null) {
            return false;
        } else if (object instanceof String || object instanceof Integer || object instanceof Boolean
                || object instanceof Character || object instanceof Byte || object instanceof Short
                || object instanceof Long || object instanceof Float || object instanceof Double) {
            return true;
        }
        return false;
    }

    /**
     * 判断是否是字符串 或者是 基本数据类型
     *
     * @param oc
     * @return 基本数据类型|字符串类型 返回true
     */
    private boolean toBasicData(Class oc) {
        if (oc.isPrimitive() || oc.isAssignableFrom(String.class) || oc.isAssignableFrom(Integer.class)
                || oc.isAssignableFrom(Boolean.class) || oc.isAssignableFrom(Character.class)
                || oc.isAssignableFrom(Byte.class) || oc.isAssignableFrom(Short.class)
                || oc.isAssignableFrom(Long.class) || oc.isAssignableFrom(Float.class)
                || oc.isAssignableFrom(Double.class)) {
            return true;
        }
        return false;
    }

    /**
     * 将JSON转JavaBean对象实例
     *
     * @param oClass  JavaBean的Class对象
     * @param jsonStr JSON对象
     * @param 
     * @return
     */
    public  T jsonToObject(Class oClass, String jsonStr) {
        T objectData = null;
        try {
            if (oClass.isArray()) {// 该class为数组的时候
                JSONArray array = new JSONArray(jsonStr);
                int len = array.length();
                // 获取到数组元素的class
                Class ComponentType = oClass.getComponentType();
                Object createArray = Array.newInstance(ComponentType, array.length());// 创建一个与JSON数组长度相同的数组
                if (toBasicData(ComponentType.newInstance())) { // 进行判断是否是基本数据类型或字符串类型
                    for (int i = 0; i < len; i++) {
                        Array.set(createArray, i, array.get(i));
                    }
                } else {
                    for (int i = 0; i < len; i++) {
                        Array.set(createArray, i, jsonToObject(ComponentType, array.get(i).toString()));
                    }
                }
                objectData = (T) createArray;
            } else if (oClass.isAssignableFrom(Date.class)) {//时间类型
                Date parse = new SimpleDateFormat(pattern).parse(jsonStr);
                objectData = (T) parse;
            } else {// 如果不是数组的话 则默认以JavaBean的形式进行解析
                objectData = (T) oClass.newInstance(); // 创建该class的对象的实例
                JSONObject json = new JSONObject(jsonStr);
                Field[] fields = oClass.getDeclaredFields();// 获取到所有的属性
                for (Field fs : fields) {// 开始遍历属性
                    fs.setAccessible(true);
                    Class cl = fs.getType(); // 取出该属性代表的class
                    String fieldName = fs.getName(); // 取出该属性的名称
                    /**
                     * 判断该属性名字在json中不为空
                     */
                    if (!json.isNull(fieldName)) {
                        String jsonData = json.get(fieldName).toString();

                        /**
                         * 判断 属性字段是否是数组类型
                         */
                        if (cl.isArray()) {
                            fs.set(objectData, analyticArray(cl, jsonData));
                        } else if (toBasicData(cl)) { // 基本数据类型
                            fs.set(objectData, json.get(fieldName));
                        } else if (cl.isInterface()) { // 接口
                            Object oj = analyticInterface(cl, (ParameterizedType) fs.getGenericType(), jsonData);
                            fs.set(objectData, oj);
                        } else if (cl.isAssignableFrom(ArrayList.class)) { // 判断该成员属性是否为ArrayList集合
                            Object oj = analyticInterface(List.class, (ParameterizedType) fs.getGenericType(),
                                    jsonData);
                            fs.set(objectData, oj);
                        } else if (cl.isAssignableFrom(HashMap.class)) { // 判断该成员属性是否为HashMap集合
                            Object oj = analyticInterface(Map.class, (ParameterizedType) fs.getGenericType(), jsonData);
                            fs.set(objectData, oj);
                        } else { // 如果以上条件都没有成立 则当对象来解析
                            fs.set(objectData, jsonToObject(cl, jsonData));
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return objectData;
    }

    /**
     * 解析数组数据
     *
     * @param arrayClass 数组的class对象
     * @param jsonStr    Json格式的字符串数据
     * @return
     */
    private Object analyticArray(Class arrayClass, String jsonStr) {
        try {
            // 首先 先获取到数组的子元素的类型class
            Class componentType = arrayClass.getComponentType();
            // 判断子元素类型 是否是基本类型 或者是String类型
            boolean is = toBasicData(componentType.newInstance());
            JSONArray jsonArray = new JSONArray(jsonStr);
            int len = jsonArray.length();
            /**
             * 创建一个与该数组类型一至 长度与JSONArray长度一致的数组
             */
            Object elementObject = Array.newInstance(componentType, len);
            if (is) {
                for (int i = 0; i < len; i++) {
                    Array.set(elementObject, i, jsonArray.get(i));
                }
            } else { // 如果不是基本数据类型的话 则调用解析对象的方法
                for (int i = 0; i < len; i++) {
                    Array.set(elementObject, i, jsonToObject(componentType, jsonArray.getString(i)));
                }
            }
            return elementObject;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 解析成员属性为接口的方法 只支持Map List 集合接口 其他的 均返回null
     *
     * @param interfaceClass    接口Class对象
     * @param jsonStr           JSON格式的文本
     * @param parameterizedType 泛型的管理
     * @return 返回解析后的实例
     */
    private Object analyticInterface(Class interfaceClass, ParameterizedType parameterizedType, String jsonStr) {
        Object breakObject = null;
        try {
            if (interfaceClass.isAssignableFrom(List.class)) { // List集合
                JSONArray array = new JSONArray(jsonStr);
                int len = array.length();
                Class c = (Class) parameterizedType.getActualTypeArguments()[0];// 获取到List集合的泛型
                List list = new ArrayList<>();
                if (toBasicData(c)) {// 判断List的泛型是否为String 或基本类型
                    for (int i = 0; i < len; i++) {
                        list.add(array.get(i));
                    }
                } else {// 调用解析对象方法
                    for (int i = 0; i < len; i++) {
                        list.add(jsonToObject(c, array.getString(i)));
                    }
                }
                breakObject = list;
            } else if (interfaceClass.isAssignableFrom(Map.class)) {
                /**
                 * 如果是map集合的话 是会有两个泛型的 对应的为 key value
                 */
                Class k = (Class) parameterizedType.getActualTypeArguments()[0];
                Class v = (Class) parameterizedType.getActualTypeArguments()[1];
                if (!k.isAssignableFrom(String.class)) {
                    throw new ClassCastException("key 请用String类型");
                } else {
                    Map map = new HashMap<>();
                    JSONObject json = new JSONObject(jsonStr);
                    Iterator iterator = json.keys();
                    if (toBasicData(v)) {// 判断value是否为基本类型或String类型
                        while (iterator.hasNext()) {
                            String key = iterator.next();
                            map.put(key, json.get(key));
                        }
                    } else {
                        while (iterator.hasNext()) {
                            String key = iterator.next();
                            map.put(key, jsonToObject(v, json.getString(key)));
                        }
                    }
                    breakObject = map;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return breakObject;
    }

    /**
     * JSON put map的key values
     *
     * @param jsonObject
     * @param key
     * @param values
     * @param fieldName
     */
    private void jsonPutMap(JSONObject jsonObject, String key, Object values, String... fieldName) {
        try {
            if (toBasicData(values)) {// 判断是否是基本数据类型
                jsonObject.put(key, values);
            } else {
                jsonObject.put(key, ObjectToString(values, fieldName));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...