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

Java 优化json构建的类型检查/强制转换,java,json,optimization,casting,Java,Json,Optimization,Casting,我正在做一个项目,我们使用javax.json来处理我们的请求/响应。我们使用的实现是org.glassfish.json。困扰我的是它不支持添加/写入对象。所以我创建了一些方法,在这些方法中,我必须检查这个实现支持的每一种类型。大概是这样的: private static void addTypeSafeValue(JsonObjectBuilder jsonBuilder, String key, Object value) { if (value instanceof St

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

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());
        }
    }
private static void addTypeSafeValue(JsonObjectBuilder jsonBuilder,字符串键,对象值){
if(字符串的值实例){
add(key,value.toString());
}else if(整数的值实例){
添加(键,(int)值);
}else if(布尔值实例){
添加(键,(布尔)值);
}else if(值instanceof Long){
添加(键,(长)值);
}else if(双精度值实例){
添加(键,(双)值);
}else if(Uri的值instanceof){
add(key,((Uri)value.toString());
}else if(映射的值实例){
add(key,convertToJsonObject((Map)value));
}else if(集合的值实例){
add(key,convertToJsonArray((Collection)value));
}else if(JsonObject的值实例){
add(key,(JsonObject)值);
}else if(JsonArray的值实例){
add(key,(JsonArray)值);
}否则{
抛出新的IllegalArgumentException(“未为:+value.getClass()实现”);
}
}
我想知道,是否有任何方法可以优化这段代码。
另一部分是我想通过消费者的
JsonObjectBuilder
JsonGenerator
,以减少一些重复的检查/代码。

TL;医生,现在一切都很好


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

最近,我在某个地方读到,Gson通常在复制字符串上花费的时间要比在反射上花费的时间多得多。所以我不太在乎

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

如果他们愿意,那么他们就必须像你一样提供一个不完整的解决方案(这对你来说很好,但对一个库来说不是),或者使它具有可扩展性,还有Jackson、Gson和许多其他人已经提供了

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

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

1:找到一些分组,这样案例的数量就会减少。您可以测试Number的
值instanceof
,然后进一步分支。然而,这几乎没有任何好处,因为数字肯定比其他案例更常见

2:为您的案例创建一个填充了转换器的
映射
,并使用类似

map.get(value.getClass()).accept(value);
当案例数量巨大或需要扩展性时,这可能是一个很好的解决方案。对于你的10个案例来说,这很可能会导致大幅减速

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

我觉得不值得
JsonObjectBuilder
JsonGenerator
是两个不相关的接口。它们都有一系列方法,这些方法相互关联,但名称不同,并不总是相互对应。因此,您需要为这两种代码编写包装器,或者像您的问题中那样复制代码。最后,无论如何,您会得到一些重复的代码


而且会很难看。我建议看一看更强大的工具,如Gson或Jackson等。

生成器和生成器接受作为参数(键、值),只是函数的名称不同。我想用这个检查(如果有办法的话)来检查两者。如下所示:addTypeSafeValue(Consumerconsumer、字符串键、对象值)。也谢谢你的回答。