1. 程式人生 > >android json解析框架 Model轉json

android json解析框架 Model轉json

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拿去檢驗是否正確.