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

我正在开发一个项目,我们使用
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());
        }
    }

我想知道,如果有任何方法来优化此代码.
另一部分是我想为消费者传递JsonObjectBuilder或JsonGenerator,以便削减一些重复的检查/代码.

最佳答案 TL; DR它很好.

关于优化,请注意您将所有内容添加到构建器(我猜)构建,而您可能希望通过线路发送字符串甚至字节[].

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

What’s bugging me is that it does not support adding/writing of Object.

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

I am wondering, if there is any way to optimize this code.

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

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

2:创建地图< Class,Consumer< Object>>为你的案件填充转换器,并使用类似的东西

map.get(value.getClass()).accept(value);

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

The other part is that I want to pass JsonObjectBuilder or JsonGenerator for consumer in order to cut some duplicated checks/code.

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

这将是相当丑陋的.我建议你看看像Gson或Jackson这样更强大的工具.

点赞