移动架构-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初看很简单,但是非常妖孽,在一段时间内我 ...
随机推荐
- JSP数据交互(二)
Application:当前服务器(可以包含多个会话):当服务器启动后就会创建一个application对象,被所有用户共享page.request.session.application四个作用域对 ...
- Laravel - 解决连接MySQL时报"The server requested authentication method unknown to the client”错误
2019-04-12发布:hangge阅读:934 1,问题描述 最近建了个 Laravel 项目,当配置好 MySQL 数据库进行请求时,页面报如下错误: SQLSTATE[HY000] [ ...
- web+页面支持批量下载吗
一.此方法火狐有些版本是不支持的 window.location.href = 'https://*****.oss-cn-**.aliyuncs.com/*********';二.为了解决火狐有些版 ...
- loj3120 「CTS2019 | CTSC2019」珍珠
link .... 感觉自己太颓废了....还是来更题解吧...[话说写博客会不会涨 rp 啊 qaq ? 题意: 有 n 个物品,每个都有一个 [1,D] 中随机的颜色,相同颜色的两个物品可以配对. ...
- CSPS2019游(tuifei)记
%%%脸哥没脸%%% Day0,日常考前紧张,做不下题去.听各大主任送祝福(从里红(wa)到外) 然后就出发了,大巴上和云力一起坐,吃了好多东西.中午因不满火车站的不合理收费,选择了面包+火腿 下午在 ...
- Java面向对象6 (AA - AE)
整理音乐(SDUT 2053) import java.util.*; public class Main { public static void main(String[] args) { Sca ...
- python 时间等待
#coding=utf- import time t1=time.time() time.sleep() t2=time.time() print(t2-t1) 输出 3.00304102898
- Beyond compare4密钥
w4G-in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwfXv5n0IHDp5hv1BM3+H1XygMtiE0-JBgacjE9tz33sIh542EmsGs1yg6 ...
- Redis学习(一) —— 基本使用与原理
一.数据结构 string Redis字符串是可修改字符串,在内存中以字节数组形式存在. 下面是string在源码中的定义,SDS(Simple Dynamic String) struct SDS& ...
- GDB使用——pwn相关
目录 寄存器 内存 peda插件命令 x命令详解 后续补充 内容来源 寄存器 1.查看寄存器 2.查看所有寄存器 3.查看某个寄存器 4.修改寄存器的值 内存 1.修改内存值 2.搜索内存 peda插 ...