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
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 fields=new ArrayList<>();
getAllFields(obj.getClass(),fields);
if(!fields.isEmpty()){
for(int i=0;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
{
parseObjToJson(sb,list.get(i));
if(i!=(list.size()-1))
{
sb.append(",");
}
}
sb.append("]");
}
}
private static void getAllFields(Class> clazz, List 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 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 getInfo() {
return info;
}
public void setInfo(List info) {
this.info = info;
}
}
测试:
User user = new User();
user.setName("zhouguizhi");
user.setAge(18);
user.setMember(true);
List 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拿去检验是否正确.