16

Android プロジェクトで Jackson 1.9.5 を使用して JSON ファイルを解析しています。

これまでのところ問題はなく、次のコードを使用してファイルをうまく解析できます。

AssetManager mgr = getAssets();
ObjectMapper mapper = new ObjectMapper();

try {
    InputStream ifp = mgr.open("detail_schema.json");
    schema = mapper.readValue(ifp, DetailSchema.class);
} catch (IOException e) {
    e.printStackTrace();
}

DetailSchema クラスは、プリミティブ型とクラスの組み合わせで構成されています。次のような JSON を解析したいという問題に直面しています。

"fields": {
    "Suburb": "Paddington",
    "State": "NSW",
    "Post Code": "2074",
    "Lollipop": "Foo Bar Haz"
}

事前にマップキーを知ることができない場合(ユーザー定義にすることができます)。そのため、関連する Java クラスがどのように見えるべきかわかりません。

つまり、この例では、次のようになります。

public class MyClass {

    public String Suburb;
    public String State;
    public String PostCode;
    public String Lollipop;

}

しかし、これは JSON ファイルの別のインスタンスでは正しくない場合があります。理想的には、ジャクソンが値をNameValuePairのようなものにマップする方法が必要です。この場合、自動オブジェクト マッピングはオプションではないのではないかと思います - 誰かがこれを確認または否定できますか?

4

1 に答える 1

23

2 つのオプションがあります。JsonNodeを返すObjectMapper で readTree を使用できます。a のJsonNode操作はツリーの操作によく似ているため、子ノードを取得したり、値を読み取ったりできます。

InputStream ifp = mgr.open("detail_schema.json");
JsonNode root = mapper.readTree(ifp);
JsonNode fields = root.get("fields");
for (JsonNode children : fields) {
    // ...
}

DetailSchema次に、オブジェクトを手動で構築する必要があります。

または、ジャクソンにそれを として逆シリアル化させることができますMap。その場合、コードを使用しますが、どこMyClassは次のようになります。

public class MyClass {
    public Map<String, Object> fields;

    // getter/setters
}

String入力がjsonのテキストであることが確実な場合は、おそらくマップ値も入力できます。(実際には、Jackson がどのような型強制を行っているかはわかりませんが、とにかく何でも許可する可能性があります...)

于 2012-07-16T05:33:55.877 に答える