移动架构-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初看很简单,但是非常妖孽,在一段时间内我 ...
随机推荐
- oracle查询数据库连接数相关
select username,count(username) from v$session where username is not null group by username;--查询各个用户 ...
- 064_将 Linux 系统中 UID 大于等于 1000 的普通用户都删除
#!/bin/bash#先用 awk 提取所有 uid 大于等于 1000 的普通用户名称#再使用 for 循环逐个将每个用户删除即可 user=$(awk -F: '$3>=1000{prin ...
- scheduled定时任务+实例请求数据库
1.scheduled定时任务类:ScheduledDemo.java package com.nantian.scheduled; import java.util.Date; import org ...
- msyql的子查询,或者叫嵌套查询
INNER和OUTER可以省略
- tinymce编辑器从word粘贴公式
很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...
- Gym 102346A Artwork dfs
Artwork Gym - 102346A 题意:给n*m的地图,入口是(0,0),出口是(n,m),其中有k个监视器,坐标是(xi,yi),监视半径是r,问一个人能不能不被监视到,从起点到终点. 如 ...
- NetworkX系列教程(10)-算法之二:最小/大生成树问题
小书匠 Graph 图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定 ...
- 2019暑期金华集训 Day2 线性代数
自闭集训 Day2 线性代数 高斯消元 做实数时,需要找绝对值最大的作为主元,以获取更高精度. 在欧几里得环(简单例子是模合数)意义下也是对的.比如模合数意义下可以使用辗转相除法消元. 欧几里得环:对 ...
- kde的配置文件
主要是home目录下:/.kde4/share/config/ 如果实在是搞不定,还可以直接将.kde4目录全部删除或者替换即可.
- elasticsearch alias
索引别名API允许使用一个名字来作为一个索引的别名,所有API会自动将别名转换为实际的索引名称. 别名也可以映射到多个索引,别名不能与索引具有相同的名称.别名可以用来做索引迁移和多个索引的查询统一,还 ...