优化json构建的类型检查/强制转换

时间:2016-05-16 16:53:01

标签: java json optimization casting

我正在处理一个项目,我们使用javax.json来处理我们的请求/响应。我们使用的实现是org.glassfish.json。困扰我的是它不支持添加/写入Object。所以我创建了方法,我必须检查每个类型,这个实现支持。像这样:

private static void addTypeSafeValue(JsonObjectBuilder jsonBuilder, String key, Object value) {
        if (value instanceof String) {
            jsonBuilder.add(key, value.toString());
        } else if (value instanceof Integer) {
            jsonBuilder.add(key, (int) value);
        } else if (value instanceof Boolean) {
            jsonBuilder.add(key, (boolean) value);
        } else if (value instanceof Long) {
            jsonBuilder.add(key, (long) value);
        } else if (value instanceof Double) {
            jsonBuilder.add(key, (double) value);
        } else if (value instanceof Uri) {
            jsonBuilder.add(key, ((Uri) value).toString());
        } else if (value instanceof Map) {
            jsonBuilder.add(key, convertToJsonObject((Map<String, ?>) value));
        } else if (value instanceof Collection) {
            jsonBuilder.add(key, convertToJsonArray((Collection<?>) value));
        } else if (value instanceof JsonObject) {
            jsonBuilder.add(key, (JsonObject) value);
        } else if (value instanceof JsonArray) {
            jsonBuilder.add(key, (JsonArray) value);
        } else {
            throw new IllegalArgumentException("Not implemented for: " + value.getClass());
        }
    }

我想知道,如果有任何方法可以优化此代码。 另一部分是我想为消费者传递JsonObjectBuilderJsonGenerator,以便削减一些重复的支票/代码。

1 个答案:

答案 0 :(得分:1)

TL; DR它很好。

关于优化,请注意您要将所有内容添加到构建器(我猜)构建,而您可能希望通过线路发送String甚至byte[]。< / p>

最近,我在某处读到Gson通常花费更多时间复制字符串而不是反射。所以我不在乎。

  

让我烦恼的是它不支持添加/写入Object。

如果他们愿意的话,那么他们必须像你一样提供一个不完整的解决方案(这对你来说很好,但不适用于图书馆)或者让它可以扩展,然后杰克逊,Gson和许多其他人已经提供了。

  

我想知道,如果有任何方法可以优化此代码。

我可以想到两种方式并且不推荐:

1:查找一些分组,以便案例数量变小。您可以测试value instanceof Number然后进一步分支。然而,几乎没有任何收获,因为数字肯定比其余的情况更常见。

2:为您创建一个填充了转换器的Map<Class, Consumer<Object>>并使用类似

的内容
map.get(value.getClass()).accept(value);

当病例数量巨大或需要可扩展性时,这可能是一个很好的解决方案。对于你的10个案例,它很可能会导致大幅放缓。

  

另一部分是我想为消费者传递JsonObjectBuilder或JsonGenerator,以便削减一些重复的检查/代码。

我不认为,这是值得的。 JsonObjectBuilderJsonGenerator是两个不相关的接口。它们都有一堆方法,它们是相关的,但命名不同,并不总是相互对应。所以你需要为它们编写包装器或者在你的问题中重复代码。最后,无论如何,你得到了一些重复的代码。

它会相当难看。我建议看看像Gson或Jackson这样的更强大的工具或其他什么。