package com.alibaba.json.bvt.serializer;
import java.lang.reflect.Type;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONToken;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
public class AbstractTest extends TestCase {
public void test_0() throws Exception {
ParserConfig.getGlobalInstance().putDeserializer(A.class, new ADeserializer());
VO vo = JSON.parseObject("{\"a\":{\"num\":1,\"name\":\"bb\"}}", VO.class);
Assert.assertTrue(vo.getA() instanceof B);
}
public void test_1() throws Exception {
ParserConfig.getGlobalInstance().putDeserializer(A.class, new ADeserializer());
VO vo = JSON.parseObject("{\"a\":{\"num\":2,\"name\":\"bb\"}}", VO.class);
Assert.assertTrue(vo.getA() instanceof C);
}
public static class ADeserializer implements ObjectDeserializer {
@SuppressWarnings("unchecked")
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
JSONObject json = parser.parseObject();
int num = json.getInteger("num");
if (num == 1) {
return (T) JSON.toJavaObject(json, B.class);
} else if (num == 2) {
return (T) JSON.toJavaObject(json, C.class);
} else {
return (T) JSON.toJavaObject(json, A.class);
}
}
public int getFastMatchToken() {
return JSONToken.LBRACE;
}
}
public static class VO {
private A a;
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
public static class A {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
public static class B extends A {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static class C extends A {
public String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}