移动架构-json解析框架
JSON在现在数据传输中占据着重要地位,相比于xml,其解析和构成都要简单很多,第三方的解析框架也不胜枚举,这里之所以要自定义一个json解析框架,一方面是更好的了解json解析过程,另一方面是有时候需要对解析出来的json数据做转换
实现的功能
json转model,model转json
实现代码
转化类
public class FastJson {
public static final int JSON_ARRAY = 1;
public static final int JSON_OBJECT = 2;
public static final int JSON_ERRO = 3;
//调用层调用
public static Object pareseObject(String json, Class clazz) {
Object object = null;
Class<?> jsonClass = null;
//JSONArray类型
if (json.charAt(0) == '[') {
try {
object = toList(json, clazz);
} catch (JSONException e) {
e.printStackTrace();
}
} else if (json.charAt(0) == '{') {
try {
JSONObject jsonObject = new JSONObject(json);
//反射得到最外层的model
object = clazz.newInstance();
//得到的最外层的key集合
Iterator<?> iterator = jsonObject.keys();
//遍历集合
while (iterator.hasNext()) {
String key = (String) iterator.next();
Object fieldValue = null;
//得到当前clazz类型的所有成员变量
List<Field> fields = getAllFields(clazz, null);
for (Field field : fields) {
//将key和成员变量进行匹配
if (field.getName().equalsIgnoreCase(key)) {
field.setAccessible(true);
//得到key所对应的值
fieldValue = getFieldValue(field, jsonObject, key);
if (fieldValue != null) {
field.set(object, fieldValue);
}
field.setAccessible(false);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return object;
}
//得到当前的value值
private static Object getFieldValue(Field field, JSONObject jsonObject, String key) throws JSONException {
Object fieldValue = null;
//得到当前成员变量类型
Class<?> fieldClass = field.getType();
if (fieldClass.getSimpleName().toString().equals("int")
|| fieldClass.getSimpleName().toString().equals("Integer")) {
fieldValue = jsonObject.getInt(key);
} else if (fieldClass.getSimpleName().toString().equals("double")
|| fieldClass.getSimpleName().toString().equals("Double")) {
fieldValue = jsonObject.getDouble(key);
} else if (fieldClass.getSimpleName().toString().equals("boolean")
|| fieldClass.getSimpleName().toString().equals("Boolean")) {
fieldValue = jsonObject.getBoolean(key);
} else if (fieldClass.getSimpleName().toString().equals("long")
|| fieldClass.getSimpleName().toString().equals("Long")) {
fieldValue = jsonObject.getLong(key);
} else if (fieldClass.getSimpleName().toString().equals("String")) {
fieldValue = jsonObject.getString(key);
} else {
//判断集合类型和对象类型
String jsonValue = jsonObject.getString(key);
switch (getJSONType(jsonValue)) {
case JSON_ARRAY:
Type fieldType = field.getGenericType();
if (fieldType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) fieldType;
//当前类所实现的泛型
Type[] fieldArgType = parameterizedType.getActualTypeArguments();
for (Type type : fieldArgType) {
Class<?> fieldArgClass = (Class<?>) type;
fieldValue = toList(jsonValue, fieldArgClass);
}
}
break;
case JSON_OBJECT:
//fieldClass成员变量类型
fieldValue = pareseObject(jsonValue, fieldClass);
break;
case JSON_ERRO:
break;
}
}
return fieldValue;
}
//获取当前json字符串的类型
private static int getJSONType(String jsonValue) {
char firstChar = jsonValue.charAt(0);
if (firstChar == '{') {
return JSON_OBJECT;
} else if (firstChar == '[') {
return JSON_ARRAY;
} else {
return JSON_ERRO;
}
}
//解析JsonArray数组
private static Object toList(String json, Class clazz) throws JSONException {
List<Object> list = null;
JSONArray jsonArray = new JSONArray(json);
list = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
//拿到JSON字符串
String jsonValue = jsonArray.getJSONObject(i).toString();
switch (getJSONType(jsonValue)) {
case JSON_ARRAY:
//外层JSONArray嵌套里面JSONArray
List<?> infoList = (List<?>) toList(jsonValue, clazz);
list.add(infoList);
break;
case JSON_OBJECT:
list.add(pareseObject(jsonValue, clazz));
break;
case JSON_ERRO:
break;
}
}
return list;
}
public static String toJson(Object object) {
//JSON载体
StringBuilder jsonBuilder = new StringBuilder();
//判断是否是集合类型
if (object instanceof List<?>) {
jsonBuilder.append("[");
List<?> list = (List<?>) object;
//获取集合类型
for (int i = 0; i < list.size(); i++) {
//解析成JSONObject类型
addObjectToJson(jsonBuilder, list.get(i));
if (i < list.size() - 1) {
jsonBuilder.append(",");
}
}
} else {
addObjectToJson(jsonBuilder, object);
}
return jsonBuilder.toString();
}
//解析单独的JSONObject类型
private static void addObjectToJson(StringBuilder jsonBuilder, Object o) {
jsonBuilder.append("{");
List<Field> fields = new ArrayList<>();
getAllFields(o.getClass(), fields);
for (int i = 0; i < fields.size(); i++) {
//代表get方法
Method method = null;
Field field = fields.get(i);
String fieldName = field.getName();
Object fieldValue = null;
//get类型方法
String methodName = "get" + ((char) (fieldName.charAt(0) - 0x20) + fieldName.substring(1));
try {
//得到method对象
method = o.getClass().getMethod(methodName);
} catch (NoSuchMethodException e) {
//is类型方法
methodName = "is" + ((char) (fieldName.charAt(0) - 0x20) + fieldName.substring(1));
try {
method = o.getClass().getMethod(methodName);
} catch (NoSuchMethodException e1) {
}
}
if (method != null) {
try {
fieldValue = method.invoke(o);
} catch (Exception e) {
e.printStackTrace();
}
}
if (fieldValue != null) {
jsonBuilder.append("\"");
jsonBuilder.append(fieldName);
jsonBuilder.append("\":");
if (fieldValue instanceof Integer
|| fieldValue instanceof Double
|| fieldValue instanceof Long
|| fieldValue instanceof Boolean) {
jsonBuilder.append(fieldValue.toString());
} else if (fieldValue instanceof String) {
jsonBuilder.append("\"");
jsonBuilder.append(fieldValue.toString());
jsonBuilder.append("\"");
} else if (fieldValue instanceof List<?>) {
addListToBuffer(jsonBuilder, fieldValue);
} else {
//类类型
addObjectToJson(jsonBuilder, fieldValue);
}
jsonBuilder.append(",");
}
if (i == fields.size() - 1 && jsonBuilder.charAt(jsonBuilder.length() - 1) == ',') {
jsonBuilder.deleteCharAt(jsonBuilder.length() - 1);
}
}
jsonBuilder.append("}");
}
//解析集合类型数据
private static void addListToBuffer(StringBuilder jsonBuilder, Object fieldValue) {
List<?> list = (List<?>) fieldValue;
jsonBuilder.append("[");
for (int i = 0; i < list.size(); i++) {
addObjectToJson(jsonBuilder, list.get(i));
if (i < list.size() - 1) {
jsonBuilder.append(",");
}
}
jsonBuilder.append("]");
}
//获取当前Class所有成员变量
private static List<Field> getAllFields(Class<?> aClass, List<Field> fields) {
if (fields == null) {
fields = new ArrayList<>();
}
//排除Object类型
if (aClass.getSuperclass() != null) {
//拿到当前Class的所有成员变量的Field
Field[] fieldsSelf = aClass.getDeclaredFields();
for (Field field : fieldsSelf) {
//排除final修饰的成员变量
if (!Modifier.isFinal(field.getModifiers())) {
fields.add(field);
}
}
getAllFields(aClass.getSuperclass(), fields);
}
return fields;
}
}
测试的model类
public class News {
private int id;
private String title;
private String content;
private User author;
private boolean isCancle;
private List<User> reader;
public News() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public User getAuthor() {
return author;
}
public void setAuthor(User author) {
this.author = author;
}
public boolean isCancle() {
return isCancle;
}
public void setCancle(boolean cancle) {
isCancle = cancle;
}
public List<User> getReader() {
return reader;
}
public void setReader(List<User> reader) {
this.reader = reader;
}
@Override
public String toString() {
return "News [id=" + id + ", title=" + title + ", content=" + content
+ ", author=" + author + ", isCancle=" + isCancle + ", reader=" + reader + "]";
}
}
public class User {
private int id;
private String name;
private String password;
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
}
}
调用测试
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private News news;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text_view);
}
public void modelToJson(View view) {
setNews();
String json = FastJson.toJson(news);
textView.append(json);
textView.append("\n\n");
}
public void jsonToModel(View view) {
String json = FastJson.toJson(news);
News news = (News) FastJson.pareseObject(json, News.class);
textView.append(news.toString());
textView.append("\n\n");
}
public void cleanText(View view) {
textView.setText("");
}
private void setNews(){
news = new News();
news.setId(1);
news.setTitle("Test Title");
news.setContent("Test Content");
news.setCancle(true);
news.setAuthor(createAuthor());
news.setReader(createReaders());
}
private static List<User> createReaders() {
List<User> readers = new ArrayList<User>();
User readerA = new User();
readerA.setId(2);
readerA.setName("Jack");
readers.add(readerA);
User readerB = new User();
readerB.setId(1);
readerB.setName("Bob");
readerB.setPassword("123456");
readers.add(readerB);
return readers;
}
private static User createAuthor() {
User author = new User();
author.setId(1);
author.setName("Alen");
author.setPassword("123456");
return author;
}
}
测试结果如图所示
移动架构-json解析框架的更多相关文章
- Spring Boot默认的JSON解析框架设置
方案一:启动类继承WebMvcConfigurerAdapter,覆盖方法configureMessageConverters ... @SpringBootApplication public cl ...
- 十七、springboot配置FastJson为Spring Boot默认JSON解析框架
前提 springboot默认自带json解析框架,默认使用jackson,如果使用fastjson,可以按照下列方式配置使用 1.引入fastjson依赖库: maven: <dependen ...
- springboot使用fastJson作为json解析框架
springboot使用fastJson作为json解析框架 springboot默认自带json解析框架,默认使用jackson,如果使用fastjson,可以按照下列方式配置使用 〇.搭建spri ...
- 4. 使用别的json解析框架【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51585921 此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boo ...
- (4)Spring Boot使用别的json解析框架【从零开始学Spring Boot】
此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boot完美使用FastJson解析JSON数据[从零开始学Spring Boot] http://412887952-qq-co ...
- 将SpringBoot默认Json解析框架jackson替换成fastjson
步骤一:引入依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson< ...
- Android总结之json解析(FastJson Gson 对比)
前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...
- Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例
Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...
- 年年出妖事,一例由JSON解析导致的"薛定谔BUG"排查过程记录
前言 做开发这么多年,也碰到无数的bug了.不过再复杂的bug,只要仔细去研读代码,加上debug,总能找到原因. 但是最近公司内碰到的这一个bug,这个bug初看很简单,但是非常妖孽,在一段时间内我 ...
随机推荐
- 【Winfrom-无边框窗体】Winform如何拖动无边框窗体?
去掉边框 this.FormBorderStyle = FormBorderStyle.None; 方法一: Point mouseOff;//鼠标移动位置变量 bool leftFlag;//标签是 ...
- 三十五.MySQL读写分离 MySQL多实例 、MySQL性能调优
1.实现MySQL读写分离 搭建一主一从结构 配置maxscale代理服务器 测试分离配置 1.1 搭建一主一从结构 192.168.4.51 主 192.168.4.52 从 测试OK 1. ...
- Convert AS400 Spool to PFD Tools – PDFing
1. Steps There’s a tool PDFing convert spool file to PDF with simple way. No need install AS400 obje ...
- learning scala How To Create Implicit Function
println("Step 1: How to create a wrapper String class which will extend the String type") ...
- Python的模块,模块的使用、安装,别名,模块作用域
模块和包 所谓的模块就是将不同功能的函数分别放到不同的文件中,这样不仅有利于函数的维护,也方便了函数的调用.在Python中,一个.py文件就是一个模块(Module). 在模块的上层有一个叫做包(P ...
- 【原创】go语言学习(十二)struct介绍1
目录: struct声明和定义 struct的内存布局以及构造函数 匿名字段和struct嵌套 struct与tag应用 struct声明和定义 1.Go中面向对象是通过struct来实现的, str ...
- 宏任务、微任务与Event Loop
说到宏任务和微任务,我们就不得不提 Event Loop 了 JS的本质是单线: 1. 一般来说,非阻塞性的任务采取同步的方式,直接在主线程的执行栈完成. 2. 一般来说,阻塞性的任务都会采用异步来执 ...
- 关于 Win10 下使用 IETester 的问题
真没想到,现在都用上Win10了,居然还会有使用 IETester 的需求,今天一个客户反应界面出现变形.错位的情况,于是又想到了这个老古董,去它的官网一看,果然N年没更新了! 抱着试试看的心理,下载 ...
- 标准6轴机器人正反解(1)-坐标系和MDH参数表
刚来新公司不久,部门给安排了新人作业,我被分到的任务是求标准6轴机器人的正反解,以及利用就近原则选择最优解.从今天开始,逐步将这部分内容总结出来: 本文以及后续文章均使用改进DH法: 连杆坐标系: 坐 ...
- qt 创建程序目录
voidinitDir() { QStringuserFilePath=QStandardPaths::writableLocation(QStandardPaths::DocumentsLocati ...