我正在处理一个项目,我们使用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
,以便削减一些重复的支票/代码。
答案 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,以便削减一些重复的检查/代码。
我不认为,这是值得的。 JsonObjectBuilder
和JsonGenerator
是两个不相关的接口。它们都有一堆方法,它们是相关的,但命名不同,并不总是相互对应。所以你需要为它们编写包装器或者在你的问题中重复代码。最后,无论如何,你得到了一些重复的代码。
它会相当难看。我建议看看像Gson或Jackson这样的更强大的工具或其他什么。