Android Java XJson工具

项目介绍

一轻量级的JSON数据工具,对Json数据字符进行自动解析成Map、List Map对象、Object对象,同时支持Map、List Map对象、Object对象转Json对象和字符串,在考虑到频繁的写Object实体类,此工具还支持自动生成类对象,你只需要传对应的参数和Json字符串;设置对应的路径就会生成实体类。部分生成的实体名称不合意的直接修改名称就行了;此前也有插件将JSON字符串复制了然后自动生成;但是这个插件的前提是获取的JSON我们能复制到;在AndroidStudio中日志中我们能够打印Json字符串,但是一点Json字符串稍微长一点,就会显示不全。那么这种情况你插件有用吗,那就只有动手敲部分代码了。

项目配置

点击附件,下载xjson的压缩包
jar配置方法: jar文件下载后,AndroidStudio中复制到app/libs/, jniLibs文件夹直接复制到app/src/main/,values中文件复制到项目中, 对jar文件右键,选择”Add As Library…..”。

arr配置方法: arr文件复制到app/libs/,在app/build.gradle 中android里面配置

repositories {
        flatDir {
            dirs 'libs'
        }
}

dependencies里面配置:

dependencies {
        compile(name: 'xjson', ext: 'aar')//这里你arr是什么名字就写什么名字
}

项目使用

1.Json字符串自动生成实体类文件:

XWriter writer = new XWriter();
writer.setClassDir(xxxx);//设置类生成的路径
wiriter.writeJavaObjectClass(jsonStr);//jsonStr为json字符串

2.读取实体对象:

File classFile = new File(writer.getClassDir()+"xxx.java");
String conent = XReader.read(classFile);//content为java文件内容,你可以直接在TextView显示操作.

3.Json字符串转Java实体:

//此处Exam为上面自动生成的实体类改名的类;你也可以自己写实体类,但是必须是字段名称和Json的key一致。
 Exam exam = XJson.parseJSONObject(Exam.class, jsonStr);

4.实体转Json字符串

Exam exam = new Exam();
exam.setId(78787);
exam.setName("Relin");
XJson.parseObject(exam );

5.Json字符串转Map

Map<String, String> map = XJson.parseJSONObject(jsonStr);//这里的jsonStr必须是JsonObject的字符串

6.Json字符串转List Map

//这里的jsonStr必须是JsonArray的字符串
List<Map<String, String>> mapList = XJson.parseJSONArray(jsonStr);

核心代码

1.Json字符转Object对象文件:
需要的是对Json字符串进行解析,然后组建字符串内容然后写入文件,那么内容是千变万化的,那么就需要写一个类的模板来替换变换的内容来处理。

 /**
     * 作者模板
     */
    private String AUTH_TEMPLATE = "/**\n" +
            " * Created by {AUTH_NAME}\n" +
            " * on {DATE}.\n" +
            " * Generated automatically by the Exam tools,\n" +
            " * the generation process need to class names,\n" +
            " * file paths, the package name, author data set,\n" +
            " * is the name of the class must be set, or you'll \n" +
            " * generate an error, the original have this file,\n" +
            " * will not generate a new file.\n" +
            " */\n\n";
    /**
     * 字段模板
     */
    private String FIELD_TEMPLATE = "    private {FIELD_TYPE} {FIELD_NAME_S};\n\n";
    /**
     * setter and getter模板
     */
    private String CONTENT_TEMPLATE =
            "    public {FIELD_TYPE} get{FIELD_NAME_M}() {\n" +
                    "        return {FIELD_NAME_S};\n" +
                    "    }\n" +
                    "\n" +
                    "    public void set{FIELD_NAME_M}({FIELD_TYPE} {FIELD_NAME_S}) {\n" +
                    "        this.{FIELD_NAME_S} = {FIELD_NAME_S};\n" +
                    "    }";

利用模板来替换对应的{}中的数据就可以了,同时需要写入文件的方法,如下:

    /**
     * 写出java文件
     *
     * @param fileName 文件名称,例如:xxx.java
     * @param content  内容
     */
    public void write(String fileName, String content) {
        File fileDir = new File(classDir + File.separator);
        if (!fileDir.exists()) {
            fileDir.mkdir();
        }
        File classFile = new File(fileDir.getAbsolutePath(), fileName);
        if (!classFile.exists()) {
            try {
                classFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(classFile));
            pw.print(content);
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

2.Json数据赋值到实体类
在实体类存在的情况下,要想赋值到实体类,首先是获取到实体类,然后再对实体类的每个字段进行赋值,Json数据解析此处我就不罗列了,如下是获取实体类字段赋值代码:

 Class bean = cls.newInstance();
        Field field = null;
        try {
            field = cls.getDeclaredField(key);//cls为传递进来的对象类
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        if (field != null) {
            field.setAccessible(true);
            //设置字段的值
            Class<?> fieldType = field.getType();
            if (fieldType == String.class) {
                field.set(bean, valueStr);//cls为传递进来的对象类
            }
            if (fieldType == Character.class) {
                field.set(bean, valueStr);
            }
            if (fieldType == int.class) {
                if (valueStr.contains(".")) {
                    new IllegalArgumentException("field " + key + " is Integer by Integer.parseInt() 

                            error, field" + key + " get value is double value.");
                } else {
                    field.set(bean, Integer.parseInt(valueStr));
                }
            }
            if (fieldType == long.class) {
                if (valueStr.contains(".")) {
                    new IllegalArgumentException("field " + key + " is Integer by Long.parseLong error,field "

                            + key + " get value is double value.");
                } else {
                    field.set(bean, Long.parseLong(valueStr));
                }
            }
            if (field.getType() == double.class) {
                if (!valueStr.contains(".")) {
                    valueStr += ".00";
                }
                field.set(bean, Double.parseDouble(valueStr));
            }
            if (fieldType == float.class) {
                if (!valueStr.contains(".")) {
                    valueStr += ".00";
                }
                field.set(bean, Float.parseFloat(valueStr));
            }
        }

在获取字段中最难的是获取List类型数据中参数,跟一般的参数不一样,需要如下方式获取(重点):

Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
    ParameterizedType parameterizedType = (ParameterizedType) type;
    Class genericClazz = (Class) parameterizedType.getActualTypeArguments()[0];
    field.set(bean, parseJSONArray(field, genericClazz, valueStr));
 }

以上几点重点知识点讲到了,其余的你就可以直接写了,下次空了写个自定义插件来生成Json对象的。

猜你喜欢

转载自blog.csdn.net/u012127961/article/details/81031597