final String json = "{\"contentType\": \"foo\", \"fooField1\": ... }";
final JsonNode node = new ObjectMapper().readTree(json);
// ^^^^^^^^^^^^^^^^^^
// n.b.: try and *reuse* a single instance of ObjectMapper in production
if (node.has("contentType")) {
System.out.println("contentType: " + node.get("contentType"));
}
public static Long time(final Callable<?> r) throws Exception {
final long start = System.currentTimeMillis();
r.call();
return Long.valueOf(System.currentTimeMillis() - start);
}
public static void main(final String[] args) throws Exception {
final URL url = new URL("http://test-api.rescuegroups.org/v5/public/swagger.php");
System.out.println(String.format( "%dms to get 'info.contact.email' with JSONPath",
time(() -> new JSONPath("info.contact.email").getWithin(url.openStream()))));
System.out.println(String.format( "%dms to just download the entire document otherwise",
time(() -> new Scanner(url.openStream()).useDelimiter("\\A").next())));
System.out.println(String.format( "%dms to bluntly map it entirely with Jackson and access a specific field",
time(() -> new ObjectMapper()
.readValue(url.openStream(), ObjectNode.class)
.get("info").get("contact").get("email"))));
}
型 使用JSONPath获取'info.contact.email'的时间为378 ms 756 ms,否则只下载整个文档 896 ms直接将其与Jackson完全Map并访问特定字段
5条答案
按热度按时间wribegjk1#
Jackson之路
假设您没有描述数据结构的POJO,您可以简单地这样做:
字符串
在评论部分解决问题
但是,如果您不希望使用整个源
String
,而只是访问一个您知道其路径的特定属性,则必须利用Tokeniser自己编写它。实际上,今天是周末,我有时间,所以我可以给予你先开始:这里有一个基本的例子!它可以在
strict
模式下运行并发出合理的错误消息,或者在请求无法被满足时宽容地返回Optional.empty
。型
假设JSON内容如下:
型
...你可以使用我的
JSONPath
类如下:型
记住,这是基本。它不强制数据类型(它返回的每个值都是
String
),只返回叶节点。实际测试用例
它处理
InputStream
s,所以你可以用一些巨大的JSON文档测试它,发现它比你的浏览器下载和显示它的内容要快得多:型
快速测试
注意,我没有重复使用任何已经存在的
JSONPath
或ObjectMapper
,所以结果是不准确的--这只是一个非常粗略的比较:型
使用JSONPath获取'info.contact.email'的时间为378 ms
756 ms,否则只下载整个文档
896 ms直接将其与Jackson完全Map并访问特定字段
ukxgm1gy2#
我只想更新2019年。我发现以下最容易实施:
字符串
我建议使用
path
而不是get
,因为get
抛出了一个NPE,其中path返回默认值为0或“",如果第一次正确设置解析,那么使用这会更安全。我的0.02美元
5cg8jx4n3#
如果您在应用程序中使用JSON jar,那么下面的代码片段很有用:
字符串
如果你使用的是Gson jars,那么相同的代码将如下所示:
型
sigwle7e4#
另一种方法是:
字符串
9cbw7uwe5#
当我决定使用 * Jackson * 作为我工作的一个项目的json库时,我就遇到了这个问题;主要是因为它的速度。我已经习惯于在我的项目中使用
org.json
和Gson
。我很快就发现,虽然在
org.json
和Gson
中许多琐碎的任务在 * Jackson中并不那么简单。所以我写了下面的课程,让事情变得更容易。
下面的类将允许您像使用简单的org.json库一样轻松地使用Jackson**,同时仍然保留Jackson的功能和速度
我用了几个小时就写好了整个代码,所以请随意调试并使代码适合您自己的目的。
请注意,下面的
JSONObject/JSONArray
将完全执行OP想要的操作。第一个是
JSONObject
,它具有与org.json.JSONObject
类似的方法;但实际上运行Jackson代码来构建JSON并解析JSON字符串。字符串
下面是JSONArray的等效代码,它的工作方式类似于org.json.JSONArray;但使用Jackson代码。
型
最后,对于一个适合所有的最有可能用于将Java类编码和解码为JSON,我添加了这个简单的类:
型
现在要品尝(测试)酱料(代码),请使用以下方法:
型
要在一个地方获取源代码,而不是复制这里的源代码,请参阅:
the code on Github