content: 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;
          }
  
      }
  }
  