Jackson(JSONライブラリ)のValueNode
のすべてのサブクラスには、基本値オブジェクトを取得するためのさまざまなメソッドがあります。 IntNode
はgetIntValue
、BooleanNode
はgetBooleanValue
となります。Jackson - generic getValueメソッド
理由だけメソッドがコールされているノードのタイプに基づいて、等Object
そのObject
あるいずれかInteger
又はBoolean
を返しgetValue
単にないジェネリック/多型方法は存在しませんか?
または...実際にそのような方法はありますか? 私の目的にはこのような方法が必要ですが、図書館のデザイナーはこのような方法を追加すると便利ではないと思われます。または...何らかの理由でその方法が意図的に欠落していますか?
私の目的:私は、ツリーをトラバースし、唯一HashMap
、Object[]
とJavaの基本タイプ(のようなInteger
、Boolean
、など)で構成される構造を生成しています下のコードでは。このような方法があれば、これらのすべてではなく、の場合はがValueNode
の葉ノードである場合には、ブロックの場合、 )。しかし、私はジャクソンのような方法はありません、そうです。だから私はそれらのすべてを醜いコード化しなければならなかったif-else if-elseの場合ブロック。
CODE:
@SuppressWarnings({ "rawtypes", "unchecked" })
private static Object traverse(JsonNode nd) {
if (nd instanceof ObjectNode) {
ObjectNode ndd = (ObjectNode) nd;
HashMap mp = new HashMap();
Iterator<String> it = ndd.getFieldNames();
while (it.hasNext()) {
String s = it.next();
mp.put(s, traverse(ndd.get(s)));
}
return mp;
} else if (nd instanceof ArrayNode) {
ArrayNode ndd = (ArrayNode) nd;
Object[] arr = new Object[ndd.size()];
for (int i = 0; i < ndd.size(); i++) {
arr[i] = traverse(ndd.get(i));
}
return arr;
} else if (nd instanceof NullNode) {
// NullNode ndd = (NullNode)nd;
return null;
} else if (nd instanceof BooleanNode) {
BooleanNode ndd = (BooleanNode) nd;
return ndd.getBooleanValue();
} else if (nd instanceof IntNode) {
IntNode ndd = (IntNode) nd;
return ndd.getIntValue();
} else if (nd instanceof LongNode) {
LongNode ndd = (LongNode) nd;
return ndd.getLongValue();
} else if (nd instanceof DoubleNode) {
DoubleNode ndd = (DoubleNode) nd;
return ndd.getDoubleValue();
} else if (nd instanceof DecimalNode) {
DecimalNode ndd = (DecimalNode) nd;
return ndd.getDecimalValue();
} else if (nd instanceof BigIntegerNode) {
BigIntegerNode ndd = (BigIntegerNode) nd;
return ndd.getBigIntegerValue();
} else if (nd instanceof TextNode) {
TextNode ndd = (TextNode) nd;
return ndd.getTextValue();
}
throw new IllegalStateException("Failed while traversing the JSON tree at node: ||| " + nd.asText() + " |||");
}
_私の目的にはこのような方法が必要です。 'JsonNode'とそのサブタイプはJSONツリーを表現するためのものなので、抽象クラスはJavaタイプではなくJSONタイプを表します。 –
@SotiriosDelimanolis "したがって抽象概念はJava型ではなくJSON型を表しています。"まあ、JSON型はJava型にマップされています。 –