我正在处理奇怪的javax.json
库。所以这就是问题所在:
我需要将Object
类型JsonValue
投射到JsonObject
或JsonArray
,以便我可以调用方法getJsonObject
和getJsonArray
它的。 JsonArray
和JsonObject
都具有相同功能的相同方法名称,但它们并未实现方法,它们是在每个方法上定义的方法!请参阅:JsonObject,JsonArray。
显而易见的解决方案是验证类型,然后根据验证的类型进行强制转换,如下所示:
if (current.getValueType().equals(JsonValue.ValueType.OBJECT)) {
current = ((JsonObject) current).getJsonObject(node);
} else if (current.getValueType().equals(JsonValue.ValueType.ARRAY)) {
current = ((JsonArray) current).getJsonObject(node);
}
但是我的代码需要太多重复。所以我问:
1)如果JsonObject
和JsonArray
都有相同的方法,为什么他们不是某些界面的实现?
2)是否有更优雅的方法可以通过一些技巧将对象同时转换为JsonObject
或JsonArray
?你知道如何改善这种情况吗?
答案 0 :(得分:2)
尽管2个不同对象上的2个方法具有相同的名称,但它们的签名实际上是不同的。 JsonObject#getJsonObject(String)
接受一个String
密钥,用于标识从键值对的JSON对象中提取的值。 JsonArray#getJsonObject(int)
接受一个int
索引,用于标识从JSON数组中提取值的元素。
在这种情况下,2个类可以共享没有适当的公共接口。您的代码必须知道是否要检查JSON对象或JSON数组并进行相应的转换。
由于所讨论的两种方法没有相同的签名,因此没有其他替代方法可以通过常规方式调用它们#34;。您可能会使用反射,但这可能会使代码更加混乱。例如,Apache Commons包括MethodUtils#invokeMethod
。您可以使用它来调用名为" getJsonObject"的任何方法,接受任何类型的对象(String
或int
)。虽然使用它会使它成为常用代码"在这两种情况下,以后阅读代码的人可能会感到困惑。他们必须跟踪这是使用反射这一事实,并且传递的参数可能是String
或int
,并且它确实都可以解决,因为它要么是一个JSON对象或数组。相反,在这种情况下,我倾向于只做低头。
答案 1 :(得分:1)
Chris是对的,您的代码必须知道是否要检查JSON对象或JSON数组并进行相应的转换。但是,如果您可以添加外部库,我建议使用gson来解析Json 这个库有JsonElement类,适合你的情况。看看this看看它是如何运作的