android json解析框架 Model轉json
阿新 • • 發佈:2019-02-04
json是客戶端與服務端資料互動格式的一種,幾乎99%客戶端與服務端資料互動都是用json,很少用xml了,那麼json解析目前有二大框架,一個是google的json,一個是FastJson(阿里的),FastJson在處理資料比較大的時候,比gson要快,今天就手寫一個簡單的json解析框架,就把這框架命名為android_simple_json
今天實現model轉json
思路:通過反射獲取類中所有的屬性,以後通過屬性組裝成get方法,然後通過get...()方法獲取值,最後組裝成一個String.
如圖所示:
程式碼如下:
先測試不帶集合的,就光一個物件package com.android_simple_json; import android.text.TextUtils; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; /** * Created by Adminis on 2017/3/4. */ public class SimpleJson { private static final String TAG = SimpleJson.class.getSimpleName(); private SimpleJson(){} public static String toJson(Object obj){ String json = ""; if(obj!=null){ StringBuffer sb = new StringBuffer(); if(obj instanceof List){ sb.append("["); List<?> list= (List<?>) obj; for (int i=0;i<list.size();i++) { parseObjToJson(sb, list.get(i)); if (i < list.size() - 1) { sb.append(","); } } }else{ parseObjToJson(sb, obj); } json = sb.toString(); } return json; } private static void parseObjToJson(StringBuffer sb, Object obj){ if(sb!=null&&obj!=null){ sb.append("{"); List<Field> fields=new ArrayList<>(); getAllFields(obj.getClass(),fields); if(!fields.isEmpty()){ for(int i=0;i<fields.size();i++){ Method method=null; Field field=fields.get(i); Object fieldValue=null; String fieldName=field.getName(); String methodName = ""; if(field.getType()==boolean.class||field.getType()==Boolean.class){ if(!TextUtils.isEmpty(fieldName)&&fieldName.startsWith("is")){ methodName=fieldName; }else{ methodName="is"+((char)(fieldName.charAt(0)-32)+fieldName.substring(1)); } }else{ methodName="get"+((char)(fieldName.charAt(0)-32)+fieldName.substring(1)); } try { method=obj.getClass().getMethod(methodName); } catch (NoSuchMethodException e) { } if(method!=null) { try { fieldValue =method.invoke(obj); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } if(fieldValue!=null) { sb.append("\""); sb.append(fieldName); sb.append("\":"); if(fieldValue instanceof Integer || fieldValue instanceof Double|| fieldValue instanceof Long|| fieldValue instanceof Boolean) { sb.append(fieldValue.toString()); }else if(fieldValue instanceof String) { sb.append("\""); sb.append(fieldValue.toString()); sb.append("\""); }else if(fieldValue instanceof List) { parseListToJson(sb,fieldValue); }else { parseObjToJson(sb,fieldValue); } if(i!=(fields.size()-1)){//排除最後一個欄位加逗號 sb.append(","); } } } } sb.append("}"); } } private static void parseListToJson(StringBuffer sb, Object fieldValue) { if(sb!=null&&fieldValue!=null){ List list= (List) fieldValue; sb.append("["); for (int i=0;i<list.size();i++) { parseObjToJson(sb,list.get(i)); if(i!=(list.size()-1)) { sb.append(","); } } sb.append("]"); } } private static void getAllFields(Class<?> clazz, List<Field> fields) { if(clazz==null){ return; } if(fields==null) { fields=new ArrayList<>(); } Field[] declaredFields=clazz.getDeclaredFields(); for(Field field:declaredFields) { if(!Modifier.isFinal(field.getModifiers())) { fields.add(field); } } } }
User.java
測試:public class User extends UserObj{ private String name; private int age; private boolean isMember; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isMember() { return isMember; } public void setMember(boolean member) { isMember = member; } }
json={"name":"zhouguizhi","isMember":true,"age":18}
現在在User類中的屬性帶上集合
測試:package com.android_simple_json; import java.util.List; /** * Created by Adminis on 2017/3/4. */ public class User extends UserObj{ private String name; private int age; public List<UserInfo> info; private boolean isMember; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isMember() { return isMember; } public void setMember(boolean member) { isMember = member; } public List<UserInfo> getInfo() { return info; } public void setInfo(List<UserInfo> info) { this.info = info; } }
User user = new User();
user.setName("zhouguizhi");
user.setAge(18);
user.setMember(true);
List<UserInfo> infos = new ArrayList<>();
for(int i=0;i<3;i++){
UserInfo userInfo = new UserInfo();
userInfo.setId(""+i);
userInfo.setName("hello_"+i);
infos.add(userInfo);
}
user.setInfo(infos);
String json = SimpleJson.toJson(user);
Log.e(TAG,"json="+json);
結果:
{"name":"zhouguizhi","info":[{"id":"0","name":"hello_0"},{"id":"1","name":"hello_1"},{"id":"2","name":"hello_2"}],"isMember":true,"age":18}
可以在網上隨便找個json解析的把上面的額json拿去檢驗是否正確.