JSON解析,不用第三方库实现JSON字符串转指定Bean对象

参考【Java】给org.json 添加 json转Bean的方法_arctan90的博客-CSDN博客

在SDK中不想加入gson或者alibaba的fastjson,但是后台给的json字串里有数十个参数。百度之后发现了大佬的文章。

原文大佬已经解析了大部分set工作,但是如果json的字符串内包含list类型会抛出异常。

针对list添加了一定解析方式。

欢迎拍砖,增加其他类型解析

---------------2021-08-17------代码更新,可以解析多层bean类,需要子bean类static声明

_________2023-08-30------更新,static不需要了,多层如果是大写的判断去掉了,该用用


import android.util.Log;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
 
public class ToJavaBean {
    /**
     * change the JSONObject to Bean
     *
     *  @author zihao
     *  @param javaBeanClazz
     *          indicate target class
     *  @return JavaBean
     *  @throws JSONException
     *             any error happened during transform
     */
    public static <T> T toJavaBean(String json, Class<T> javaBeanClazz)
            throws JSONException {
        JSONObject jsonObject=new JSONObject(json);
        Method[] beanMethods = javaBeanClazz.getDeclaredMethods();
        Class<?>[] cls=javaBeanClazz.getClasses();
        T javaBean = null;
        try {
            javaBean = javaBeanClazz.newInstance();
        } catch (Exception e){
            e.printStackTrace();
            throw new JSONException("Can not create a instance of Class "
                    + javaBeanClazz.getName() + ".");
 
        }
        for (Method method : beanMethods)
        {
            if (method.getName().startsWith("set"))
            {
                String field = method.getName();
                field = field.substring(field.indexOf("set") + 3);
                field = field.charAt(0) + field.substring(1);
                Log.d("field",field);
                Log.d("fieldclass",jsonObject.get(field).getClass().getName());
                try {
                    if (jsonObject.opt(field)==null)
                    {
                        continue;
                    }
                }catch (Exception e){
                    throw new JSONException("Can not find property"
                            + " setter for field \"" + field
                            + "\" in Class \"" + javaBeanClazz.getName()
                            + "\".");
                }
 
                if (jsonObject.get(field).getClass()==JSONArray.class)
                {
                    ArrayList arrayList=new ArrayList();
                    JSONArray jsonArray= jsonObject.getJSONArray(field);
                    for (Class<?> cl : cls) {
                        if (cl.getName().indexOf(field) > 0) {
                            for (int i=0;i<jsonArray.length();i++){
                                JSONObject data=jsonArray.optJSONObject(i);
                                arrayList.add(toJavaBean(data.toString(), cl));
                            }
                        }
                    }
                    try {
                        method.invoke(javaBean, arrayList);
                    } catch (IllegalAccessException | InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        throw new JSONException("Can not find property"
                                + " setter for field \"" + field
                                + "\" in Class \"" + javaBeanClazz.getName()
                                + "\".");
                    }
                }
                else if (jsonObject.get(field).getClass()==JSONObject.class){
                    for (Class<?> cl : cls) {
                        if (cl.getName().indexOf(field) > 0) {
                            Log.d("clsname",cl.getName());
                            Log.d("value",jsonObject.get(field).toString());
                            try {
                                method.invoke(javaBean, toJavaBean(jsonObject.get(field).toString(),cl));
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                throw new JSONException("Can not find property"
                                        + " setter for field \"" + field
                                        + "\" in Class \"" + javaBeanClazz.getName()
                                        + "\".");
                            }
                        }
                    }
                }
                else {
                    try {
                        method.invoke(javaBean, jsonObject.get(field));
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        throw new JSONException("Can not find property"
                                + " setter for field \"" + field
                                + "\" in Class \"" + javaBeanClazz.getName()
                                + "\".");
                    }
                }
            }
        }
        return javaBean;
    }
}

使用的话


MyBean myBean=ToJavaBean.toJavaBean(jsonString, MyBean.class);
public class MyBean {
    private String name;
    private String value;
    private KidBean kidbean;
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name= name;
    }
    public String getValue() {
        return this.value;
    }
    public void setValue(String value) {
        this.value= value;
    }
    public String getKidbean() {
        return this.kidbean;
    }
    public void setKidbean(KidBean kidbean) {
        this.kidbean= kidbean;
    }
    public static class KidBean {
        private A a;
        ......
    }
}

尽量用jsonFormat等工具直接生成一个合适的bean类

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值