10

複数のタイプを持つことができる JSON ファイルがあります。

例えば:

{
    "dog": {
        "owner" : "John Smith",
        "name" : "Rex",
        "toys" : {
            "chewtoy" : "5",
            "bone" : "1"
        }
    },
    "person": {
        "name" : "John Doe",
        "address" : "23 Somewhere Lane"
    }
    // Further examples of dogs and people, and a few other types.
}

これらをオブジェクトに解析したい。すなわち。owner/name/toys 属性を持つ Dog オブジェクトと、name/address 属性を持つ person を作成し、Jackson を使用して読み込んでオブジェクトを作成したいと考えています。

順序が重要です。たとえば、Rex が John Doe の前に登場したことを知る必要があります。ストリームのようなアプローチを採用したいと思います (つまり、Rex を読み取って解析して Dog オブジェクトにし、それを処理して破棄し、John Doe に移ります)。したがって、ストリームベースのアプローチが必要です。

これを達成するために、ストリーム読み取り API (順番に実行するため) と ObjectMapper インターフェイス (JSON から Java オブジェクトを作成するため) の両方を使用する方法がわかりません。

4

1 に答える 1

11

これを行うには、ファクトリでオブジェクト マッパーを使用する必要があります。

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
...
private static ObjectMapper mapper = new ObjectMapper();
private static JsonFactory factory = mapper.getJsonFactory();

次に、入力用のパーサーを作成します。

JsonParser parser = factory.createJsonParser(in);

これで、 parser.nextToken()への呼び出しとparser.readValueAs(Class c)への呼び出しを混在させることができます。マップからクラスを取得する例を次に示します。

Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
classMap.put("dog", Dog.class);
classMap.put("person", Person.class);

InputStream in = null;
JsonParser parser = null;
List<Object> results = new ArrayList<Object>();
try {
  in = this.getClass().getResourceAsStream("input.json");
  parser = factory.createJsonParser(in);
  parser.nextToken();// JsonToken.START_OBJECT
  JsonToken token = null;
  while( (token = parser.nextToken()) == JsonToken.FIELD_NAME ) {
    String name = parser.getText();
    parser.nextToken(); // JsonToken.START_OBJECT
    results.add(parser.readValueAs(classMap.get(name)));
  }
  // ASSERT: token = JsonToken.END_OBJECT
}
finally {
  IOUtils.closeQuietly(in);
  try {
    parser.close();
  }
  catch( Exception e ) {}
}
于 2012-11-20T04:46:38.853 に答える