在运行时动态输入类文字作为方法参数

时间:2012-07-25 08:42:02

标签: java json jackson

我有一个使用外部库(Jackson)的应用程序,我需要的方法需要一个类文字作为参数。因此,如果我希望将我的JSON字符串解析为User对象:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);

现在,我希望动态使用此方法(即使用相同的代码行解析不同的JSON字符串)。例如:

String json1 = "{"type":"jacket",...}";
String json2 = "{"type":"sweater",...}";

Object object = mapper.readValue(json1/json2, ???); 
//returns a Jacket object OR Sweater object based on the "type" key
//i.e. use Jacket.class as the 2nd argument if "type" is "jacket"
//OR Sweater.class if "type" is "sweater"

//After getting the deserialized object,
//if object is Jacket, cast as a Jacket
//if object is Sweater, cast as a Sweater

当然,有问题的JSON字符串可以用于任何类,因此我不能简单地对if-else循环进行硬编码。我已经看过自定义序列化程序,但坦率地说,它在谈论它的内容时非常迷失,并且希望能够帮助我解决这个问题。

总之,我需要一些方法来首先从String定义一个类文字,然后将生成的Object转换为特定的类(但我的重点是让readValue动态工作)。

2 个答案:

答案 0 :(得分:1)

看起来你需要在JSON类型变量和Java类类型之间进行映射。

通常结果应该是这样的地图:

Map<String, Class<? extends YourSupertype>> map = new HashMap<>();
map.put("sweater", Sweater.class);
map.put("jacket", Jacket.class);

只需在文件中的某处存储可能的服装类型,然后执行以下操作:

String clothingType = nextEntryFromFile();
String className = constructClassNameFromClothingType(clothingType);
map.put(clothingType, Class.forName(className));

答案 1 :(得分:0)

由于1.5版杰克逊支持多态类型处理,请点击此处http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html 在这些情况下,有一些关于如何正确处理反序列化的例子。