项目介绍
一轻量级的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对象的。