0

Linkedin Rest APIを扱う場合、多くのフィールドは次のような形式になります。

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

それ以外の:

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

これは、jsonをPositionオブジェクトにマップしようとすると多くの問題を引き起こします。JSON応答を解析するためにJacksonでJavaを使用しています。「_total」フィールドと「values」フィールドを自動的に無視するようにオブジェクトマッパーを設定する方法はありますか?

4

2 に答える 2

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();
于 2012-08-07T17:20:50.063 に答える
1

明らかに@kpentchevはこの問題に対する実行可能な解決策を提供しましたが、私は個人的に可能な限り手動パーサーを避ける傾向があります。この場合、生のjsonをマップするための一種のラッパークラスを作成することになりました。

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

  //setter and getter
}

この方法では少し冗長ですが、手動ラッパーを使用することは避けられます。ネストされたオブジェクトの場合でも、私にとってはうまく機能します。

于 2012-08-08T02:51:34.723 に答える