android json解析框架 Model转json

本文介绍了在Android中进行JSON解析的两种主要框架——Google的Gson和阿里巴巴的FastJson,并指出在处理大量数据时,FastJson的效率更高。接着,作者通过一个实例展示了如何手动将Model转换为JSON,利用反射获取类属性并生成getter方法,最终组装成JSON字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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拿去检验是否正确.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值