如何将字符串转换为泛型类型对象

时间:2014-12-19 02:30:14

标签: java json jackson

我需要使用Jackson流API对以下文件进行反序列化。

{ “key1”: {“value”:{…} },
  “key2”: {“value”:{…} },
  “key3”: {“value”:{…}},
   ....
  “keyn”: {“value”:{…}}  
}

然后使用kvmap.put(K,ValueClass)将它们放到HashMap kvmap中; 我的理解是这样做的方法是:我必须使用jp.getCurrentName()解析K的字符串,然后使用:mapper.readValue(jp,ValueClass.class)获取ValueClass。即:

private <K, V> HashMap<K, ValueClass<V>> loadFileStream(File f)
      ObjectMapper mapper = new ObjectMapper();
      HashMap<K, ValueClass<V>> kvmap  = ...
      ....
      current = jp.nextToken();
      if (current != JsonToken.START_OBJECT) {
          return with error information.
      }   
      while (jp.nextToken() != JsonToken.END_OBJECT) {
         String key = jp.getCurrentName();
         K = implement a function to convert from key to K;
         current = jp.nextToken();
         if (current == JsonToken.START_OBJECT) {
              ValueClass<V> value = mapper.readValue(jp, ValueClass.class);
              kvmap.put(K, value);
         }
         else {jp.skipChildren();}
      }
      return kvmap;
}

我的理解是,反序列化密钥的唯一方法是jp.getCurrentName(),因为它不作为json格式包含在{}中,所以我无法使用诸如readValue()来获取它。这是对的吗?然后 我的问题是如何实现一个函数来从字符串键转换为泛型类型K?我认为如果readValue()可以将字符串转换为相应的泛型类型,理想情况下,我应该能够将字符串键转换为泛型类型K.但怎么样?

1 个答案:

答案 0 :(得分:0)

通常情况下,你只需使用ObjectMapper并传递TypeReference作为参数:

final TypeReference typeRef = new TypeReference<Map<K, ValueClass<V>>>(){};

return mapper.readValue(theFileObject, typeRef);

这应该是开箱即用的。如果没有,将抛出一个例子并指出问题所在。