Java多层对象嵌套的系列化和反系列化
在接口测试的时候, 接口参数往往是一个复杂嵌套对象, 在数据准备的时候,可以使用序列化方式管理测试数据,参数模板的生成.
在直接调用 gson, fastjson, jsonlib
等等任何一个第三方包,都没有提供这种递归序列化参数的功能,需要我们自己定制实现.
OK, dont talk too much, just show u the code:
package com.teda.util;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class JsonUtil
{
public static String
toJsonString(String api)
{
Class>
clazz =
getClass(api);
Object
object =
null;
try {
object =
buildObject(clazz);
}
catch (SecurityException
| InstantiationException | IllegalAccessException
e)
{
e.printStackTrace();
}
return toJsonString(object);
}
private static Class>
getClass(String api)
{
try {
Class>
clz =
Class.forName(api);
return clz;
}
catch (Exception
e)
{
}
return null;
}
private static final String
MAP_KEY_PLACE_HOLDER = "MAP_KEY_PLACE_HOLDER";
private static String
toJsonString(Object obj)
{
JSON.DEFFAULT_DATE_FORMAT
= "yyyy-MM-dd
HH:mm:ss";
return JSONObject.toJSONString(obj,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullBooleanAsFalse,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.QuoteFieldNames,
SerializerFeature.DisableCheckSpecialChar,
SerializerFeature.WriteEnumUsingToString);
}
private static Object
buildObject(Class>
clazz)
throws SecurityException,
InstantiationException, IllegalAccessException {
Object
ob =
clazz.newInstance();
if (isBaseType(clazz))
return ob;
Field[]
fields =
clazz.getDeclaredFields();
List
selfFields =
Arrays.asList(fields);
List
pFields =
new ArrayList();
getParentClassFields(pFields,
clazz);
pFields.addAll(selfFields);
for (Field
field :
pFields)
{
Class>
fieldType =
field.getType();
if (isArrayType(fieldType))
{
Class>
trueTypeOfArray =
fieldType.getComponentType();
setFieldValue(clazz,
field,
ob,
Array.ne