package jef.json;
import java.lang.reflect.Type;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
/**
* 为了在FastJson中实现一个类似于Google Gson的TypeAdapter这样的东西抽象类,
*
*
* 首先要明确fastjson和google gson反序列化最大的不同。
* <li>fast-json: string -> java bean</li>
* <li>google gson: string -> json结构 -> java bean</li><br />
* <p>
* 在gson中,自定义反序列化器其实是指定义从json结构到java bean的拼装逻辑,而不是字符串解析逻辑。因此gson的自定义反序列化器写法要简单得多。(性能差一点)
* 但是我认为fast-json主要是通过硬编码来解决反射开销、遍历字段开销。如果用户要扩展json序列化和反序列化逻辑而造成的算法开销是值得付出的,因此做这样的扩展是有价值的。
* <br/>
* <p>
* 由于fastJson的json结构描述不是像gson那样的单根结构,json primitive和json null都是非包装的。 因此一个Json value只能表述为Object。
* 为了避免用户直接操作Object做反序列化,这里将反序列化逻辑拆为四个方法。
* <li>{@link #processArray(ParserConfig, JSONArray)}</li>
* <li>{@link #processObject(ParserConfig, JSONObject)}</li>
* <li>{@link #processNull(ParserConfig)}</li>
* <li>{@link #processPrimitive(ParserConfig, Object)}</li>
* <p>
* <code><pre>
*
* </pre></code>
*
*
*
* @author jiyi
*
* @param <T>
*/
public abstract class JsonTypeDeserializer<T> implements ObjectDeserializer{
@SuppressWarnings("unchecked")
public final <X> X deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
Object obj=parser.parse();
ParserConfig config=parser.getConfig();
return (X)process(config,obj);
}
/**
* 将JSON结构拼装为java bean
* @param config
* @param jsonStruct
* @return
*/
public final T process(ParserConfig config,Object jsonStruct){
if(jsonStruct==null){
return processNull(config);
}else if(jsonStruct instanceof JSONObject){
return processObject(config,(JSONObject)jsonStruct);
}else if(jsonStruct instanceof JSONArray){
return processArray(config,(JSONArray)jsonStruct);
}else{
return processPrimitive(config,jsonStruct);
}
}
/**
* 根据JSONObject返回java bean
* @param config
* @param obj
* @return
*/
public abstract T processObject(ParserConfig config,JSONObject obj) ;
/**
* 根据JSONArray返回java bean
* @param config
* @param obj
* @return
*/
public T processArray(ParserConfig config,JSONArray obj) {
return null;
}
/**
* 根据json结构中的String number date等基础数值返回java bean
* @param config
* @param obj
* @return
*/
public T processPrimitive(ParserConfig config,Object obj){
return null;
}
/**
* 根据json结构中的null数据返回java bean
* @param config
* @return
*/
public T processNull(ParserConfig config){
return null;
}
public int getFastMatchToken() {
return '{';
}
}