android通过网络框架 json数据,android json解析框架 Model转json

json是客户端与服务端数据交互格式的一种,几乎99%客户端与服务端数据交互都是用json,很少用xml了,那么json解析目前有二大框架,一个是google的json,一个是FastJson(阿里的),FastJson在处理数据比较大的时候,比gson要快,今天就手写一个简单的json解析框架,就把这框架命名为android_simple_json

今天实现model转json

思路:通过反射获取类中所有的属性,以后通过属性组装成get方法,然后通过get...()方法获取值,最后组装成一个String.

如图所示:

0818b9ca8b590ca3270a3433284dd417.png

代码如下:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值