content: package com.alibaba.json.bvt.parser;
  
  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;
  import com.alibaba.fastjson.serializer.SerializerFeature;
  import com.alibaba.json.bvtVO.ae.*;
  import junit.framework.TestCase;
  
  import java.lang.reflect.Type;
  import java.util.Arrays;
  
  /**
   * Created by wenshao on 08/05/2017.
   */
  public class AETest extends TestCase {
      static String jsonData = "{\n" +
              "    \"areaList\":[\n" +
              "        {\n" +
              "            \"type\":\"floor\",\n" +
              "            \"name\":\"I'm floor\",\n" +
              "            \"children\":[{\n" +
              "                \"type\":\"item\",\n" +
              "            \"name\":\"I'm item 0\"\n" +
              "            },\n" +
              "        {\n" +
              "              \"type\":\"item\",\n" +
              "            \"name\":\"I'm item 1\"\n" +
              "        }\n" +
              "\n" +
              "            ]\n" +
              "        },{\n" +
              "            \"type\":\"item\",\n" +
              "            \"name\":\"I'm item 2\"\n" +
              "        }\n" +
              "    ]\n" +
              "}";
  
      public void test_for_ae() throws Exception {
          ParserConfig.getGlobalInstance().putDeserializer(Area.class, new ObjectDeserializer() {
              public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
                  JSONObject jsonObject = (JSONObject) parser.parse();
                  String areaType;
  
                  if (jsonObject.get("type") instanceof String) {
                      areaType = (String) jsonObject.get("type");
                  } else {
                      return null;
                  }
                  if (Area.TYPE_FLOOR.equals(areaType)) {
                       return (T) JSON.toJavaObject(jsonObject, Floor.class);
                  } else if (Area.TYPE_ITEM.equals(areaType)) {
                      return (T) JSON.toJavaObject(jsonObject, Item.class);
                  }
  
                  return null;
              }
  
              public int getFastMatchToken() {
                  return JSONToken.LBRACE;
              }
          });
  
  
          Data data = JSON.parseObject(jsonData, Data.class);
  
          Item item = (Item) ((Floor)(data.areaList.get(0))).children.get(0);
      }
  }
  