【问题标题】:Optimizing type checks/casts for json building优化 json 构建的类型检查/强制转换
【发布时间】:2016-05-21 16:46:54
【问题描述】:

我正在处理一个项目,我们使用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 以减少一些重复的检查/代码。

【问题讨论】:

    标签: java json optimization casting


    【解决方案1】:

    TL;DR 没关系。


    关于优化,请注意您将所有内容添加到构建器(我猜)构建器,而您可能希望通过网络发送String 甚至byte[]

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

    困扰我的是它不支持添加/写入对象。

    如果他们愿意,那么他们必须像你一样提供一个不完整的解决方案(这对你来说很好,但对图书馆来说不是)或者让它可扩展,然后就有了 Jackson、Gson 和许多其他人。

    我想知道是否有任何方法可以优化这段代码。

    我可以想到两种方法,都不推荐:

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

    2:创建一个Map&lt;Class, Consumer&lt;Object&gt;&gt;,为您的案例填充转换器并使用类似

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

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

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

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

    而且会很丑。我建议看看 Gson 或 Jackson 等更强大的工具。

    【讨论】:

    • builder和generator接受的参数(key, value),只是函数名不同。我想对两者都使用此检查(如果有办法)。像这样:addTypeSafeValue(Consumerconsumer, String key, Object value)。也感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多