参考【Java】给org.json 添加 json转Bean的方法_arctan90的博客-优快云博客
在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类