javax.json对象具有相同的方法,但它们不是通用接口的实现。如何施展?

时间:2017-07-20 03:38:17

标签: java json

我正在处理奇怪的javax.json库。所以这就是问题所在:

我需要将Object类型JsonValue投射到JsonObjectJsonArray,以便我可以调用方法getJsonObjectgetJsonArray它的。 JsonArrayJsonObject都具有相同功能的相同方法名称,但它们并未实现方法,它们是在每个方法上定义的方法!请参阅:JsonObjectJsonArray

显而易见的解决方案是验证类型,然后根据验证的类型进行强制转换,如下所示:

            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)如果JsonObjectJsonArray都有相同的方法,为什么他们不是某些界面的实现?

2)是否有更优雅的方法可以通过一些技巧将对象同时转换为JsonObjectJsonArray?你知道如何改善这种情况吗?

2 个答案:

答案 0 :(得分:2)

尽管2个不同对象上的2个方法具有相同的名称,但它们的签名实际上是不同的。 JsonObject#getJsonObject(String)接受一个String密钥,用于标识从键值对的JSON对象中提取的值。 JsonArray#getJsonObject(int)接受一个int索引,用于标识从JSON数组中提取值的元素。

在这种情况下,2个类可以共享没有适当的公共接口。您的代码必须知道是否要检查JSON对象或JSON数组并进行相应的转换。

由于所讨论的两种方法没有相同的签名,因此没有其他替代方法可以通过常规方式调用它们#34;。您可能会使用反射,但这可能会使代码更加混乱。例如,Apache Commons包括MethodUtils#invokeMethod。您可以使用它来调用名为" getJsonObject"的任何方法,接受任何类型的对象(Stringint)。虽然使用它会使它成为常用代码"在这两种情况下,以后阅读代码的人可能会感到困惑。他们必须跟踪这是使用反射这一事实,并且传递的参数可能是Stringint,并且它确实都可以解决,因为它要么是一个JSON对象或数组。相反,在这种情况下,我倾向于只做低头。

答案 1 :(得分:1)

Chris是对的,您的代码必须知道是否要检查JSON对象或JSON数组并进行相应的转换。但是,如果您可以添加外部库,我建议使用gson来解析Json 这个库有JsonElement类,适合你的情况。看看this看看它是如何运作的