2012-09-04 63 views
1

在客户端上,我有一个Javascript应用程序对实体进行操作,其中一些引用了包装对象,它包含服务器端实例的唯一键 - 基本上是某种引用。有些按原样处理,所有实体字段都存在。如何将不同的对象表示反序列化为POJO?

当我通过修改发送实体并将其保存在服务器上时,本身实体的某些字段是引用,有些字段是完整对象。

例如,说我有车,CarModel和车库,传入的JSON可以是这样的:

{ 
    addedItems: [{ 
     "@class": "mydoamin.Car", 
     belongsTo: { 
      "key": "Unique_Garage_Key" 
     }, 
     carModel: { 
      name: "New Car Model", 
      wheelSize: 14, 
      doors: 5 
     } 
    },{ 
     "@class": "mydomain.Car", 
     belongsTo: { 
      "name": "New Garage" 
     }, 
     carModel: { 
      key: "Unique_Key_Of_Existing_Car_Model" 
     } 
    }] 
} 

对于这个服务器上的一部分工作,我需要一个灵活的解串器,它可以反序列化两格式化为相应的域POJO。

从我从杰克逊文档中得到的信息,我开始了一个反序列化器,但是我没有找到正确写入它的线索。我在解串器中得到的是JsonParser和DeserializationContext。我认为可以通过解析流两次,首先作为包装器对象来实现,如果失败,请尝试将其读为域对象。 不幸的是,我不能看到这与JsonParser可能。

所以基本上我的方法来解串器是:

Car car; 
try { 
    Wrapper carRef = jp.readValueAs(Wrapper.class); 
    car = wrapper.unwrap(carRef); 
} catch (Exception e) { 
    // rewind the stream somehow... 
    car = jp.readValueAs(Car.class); 
} 

可有人评论这是可能与JsonParser,并就如何实现这一目标的反序列化的情况下,也许更好的想法?

谢谢

回答

1

TreeTraversingParser解决了这个问题。

 JsonNode rootEntityNode = jp.readValueAsTree(); 
     TreeTraversingParser treeTraversingParser = new TreeTraversingParser(rootEntityNode, jp.getCodec()); 

在此之后,您可以分析解析的JsonNode的类型和正确的反序列化。

相关问题