android中json的序列化与反序列化
16lz
2021-01-23
最近项目中需要在android中将对象转为json字串以及反序列化为对象,查阅了android sdk文档后,发现android中没有类似C#里DataContractJsonSerializer的类,想想需求也不算复杂,就自己写了两个方法解决,代码如下:
public staticStringgetJson(ObjectobjSource){try{
Objectobject=getJsonObject(objSource);
if(object== null)
return"";
return((JSONObject)object).toString();
} catch(Exceptionerr){
Log.e(TAG,"getJsonexception:"+err.getMessage());
return"";
}
}
private staticObjectgetJsonObject(ObjectobjSource) throwsException{
if(objSource!= null){
Class<?>objClass=objSource.getClass();
if(objClass.getPackage().getName().startsWith(PackageString)){
JSONObjectjsonObject= newJSONObject();
Field[]publicFields=objClass.getFields();
Objectval;
for(Fieldfield:publicFields){
val=field.get(objSource);
if(val!= null){
Class<?>valClass=val.getClass();
if(valClass.isArray()){
JSONArrayarray= newJSONArray();
intlength=Array.getLength(val);
for( inti=0;i<length;i++){
array.put(getJsonObject(Array.get(val,i)));
}
jsonObject.put(field.getName(),array);
} else if(valClass.equals(ArrayList. class)){
ArrayList<?>aList=ArrayList. class.cast(val);
Iterator<?>iterator=aList.iterator();
JSONArrayarray= newJSONArray();
while(iterator.hasNext()){
array.put(getJsonObject(iterator.next()));
}
jsonObject.put(field.getName(),array);
} else{
jsonObject.put(field.getName(),getJsonObject(val));
}
} else{
jsonObject.put(field.getName(), null);
}
}
returnjsonObject;
} else{
returnobjSource;
}
}
return null;
}
public staticObjectparseJson(Class<?>targetClass,StringjsonString){
try{
Objectobject=targetClass.newInstance();
JSONObjectjsonObject= newJSONObject(jsonString);
Stringkey;
Class<?>fieldClass;
Objectelement;
Class<?>elementType;
Field[]fields=targetClass.getFields();
for(Fieldfield:fields){
key=field.getName();
fieldClass=field.getType();
if(fieldClass.equals(ArrayList. class)){
StringgenericType=field.getGenericType().toString();
if(genericType.indexOf("<")>0){
genericType=genericType.substring(genericType.indexOf("<")+1,genericType.lastIndexOf(">"));
}
ArrayList<Object>aList= newArrayList<Object>();
JSONArrayarray=jsonObject.getJSONArray(key);
intlength=array.length();
if(genericType.startsWith(PackageString)){
elementType=Class.forName(genericType);
Field[]elementFields=elementType.getFields();
JSONObjectsubJsonObject;
for( inti=0;i<length;i++){
element=elementType.newInstance();
subJsonObject=array.getJSONObject(i);
for(FieldsubField:elementFields){
subField.set(element,subJsonObject.get(subField.getName()));
}
aList.add(element);
}
} else{
for( inti=0;i<length;i++){
aList.add(array.get(i));
}
}
field.set(object,aList);
} else if(fieldClass.isArray()){
JSONArrayarray=jsonObject.getJSONArray(key);
intlength=array.length();
StringarrayTypeName=fieldClass.getComponentType().getName();
Object[]objArray= newObject[length];
if(arrayTypeName.startsWith(PackageString)){
elementType=Class.forName(arrayTypeName);
Field[]elementFields=elementType.getFields();
JSONObjectsubJsonObject;
for( inti=0;i<length;i++){
element=elementType.newInstance();
subJsonObject=array.getJSONObject(i);
for(FieldsubField:elementFields){
subField.set(element,subJsonObject.get(subField.getName()));
}
objArray[i]=element;
}
} else{
for( inti=0;i<length;i++){
objArray[i]=array.get(i);
}
}
field.set(object,objArray);
} else{
field.set(object,jsonObject.get(key));
}
}
returnobject;
} catch(Exceptionerr){
Log.e(TAG,"parseJsonexception:"+err.getMessage());
return null;
}
}
支持基本类型、数组、ArrayList成员组成的类
更多相关文章
- android ListView 示例1 entries 指定一个数组资源
- 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种
- Android中将资源文件转为Bitmap对象
- 面向UDP的Android——PC双向通信(三):在Android客户端和PC服务器端
- Android调用WebService系列之KSoap2对象解析
- Android Application对象必须掌握的七点
- android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入S
- Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲