使用Linkedin Rest API进行Jackson对象映射方法

时间:2012-08-07 16:51:48

标签: java jackson linkedin

在处理Linkedin Rest API时,很多字段的格式如下:

"positions":
{
  "_total": 1,
  "values": [{"title": "Software Developer"}]
}

而不是:

"positions":
{
  [{"title": "Software Developer"}] 
}

当我尝试将json映射到Position对象时,这会带来很多麻烦。我正在使用Java与Jackson来解析JSON响应。有没有办法设置对象映射器,以便它会自动忽略“_total”和“values”字段?

2 个答案:

答案 0 :(得分:1)

我认为不可能将ObjectMapper配置为自动执行此操作。

您可以尝试编写自己的解析器,具体如下:

JsonFactory f = new JsonFactory();
JsonParser jp = f.createJsonParser(new File("positions.json"));
List<Position> positions = new LinkedList<Position>();
jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
while (jp.nextToken() != JsonToken.END_OBJECT) {
  String fieldname = jp.getCurrentName();
  jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY
  if ("positions".equals(fieldname)) { // contains an object
    Position pos = new Position();
    while (jp.nextToken() != JsonToken.END_OBJECT) {
      String namefield = jp.getCurrentName();
      jp.nextToken(); // move to value
      if ("value".equals(namefield)) {
        pos.setValue(jp.getText());
      } 
  }
}
jp.close();

答案 1 :(得分:1)

显然@kpentchev为这个问题提供了可行的解决方案,但我个人倾向于尽可能避免使用手动解析器。在这种情况下,我最终编写了一种包装类来映射原始json:

public class PositionWrapper
{
  private Long _total;
  private List<Position> values;

  //setter and getter
}

虽然这种方式有点多余,但它避免使用手动包装器。对我来说效果很好,即使对于嵌套对象也是如此。