我正在尝试用 Java 动态解析大量数据。换句话说,我有大量不同类型的数据,所以我将它们放在一个字符串或一个 JSON 字符串中(通过 GSON),而不是这样做:
switch(data){
case instanceof Class1:
Class1 data = gson.fromJson(jsonString);
//Do Stuff for class 1 layout
case instanceof Class2:
Class2 data = gson.fromJson(jsonString);
etc.
因此,我计划将数据放入 String 或 Json String 中并解析出值(深度优先).
我在一台低端 PC(单核 Atom 处理器)上,我正在尝试减少我对 CPU 的负担,因此确定哪个会更快......使用拆分或使用递归 JSON 的正则表达式字符串操作解析器。
最佳答案
让我们讨论一下您在这里提到的两个案例:
案例 1: 使用 gson(映射到类)为每个 json 输入创建实例
和
案例 2:创建一个文档(或类似类型的对象)本身并尝试从那里访问数据。
对于情况 2,您不需要自己编写解析器:已有可用的解析器。 我将在这里写下一个 jackson 示例(gson 也必须有类似的东西):
String myJson = "{ \"type\" : \"foo\", \"class\" : 3 }";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode node = objectMapper.readValue(myJson, JsonNode.class);
JsonNode type = node.get("type");
System.out.println(type.asText());
根据我的经验,在这两种情况下,性能差异并不大,因为库可以非常有效地处理解析,但是如果您有很多不同类型的 JSON,那么创建它就没有任何意义每个 JSON 中的 POJO(如此多的映射!!)。
由于像 this 这样的性能原因,我个人没有使用 gson但是您可以使用 jackson 创建所谓的 ObjectMapper 并非常有效地使用它。我想 gson 中也应该有类似的东西。
唯一的缺点是每个字段现在都可以通过字符串输入访问,这可能会使您的代码有点不可读。
编辑:
如果你真的想遍历 json 的所有字段,你最终将不得不进行 DFS,但是使用 JsonNode 的 fields
方法仍然可以避免解析。
root.fields()
将返回一个包含其中条目的迭代器,然后可以按照答案 here 中的描述优雅地使用它.
请记住,gson 中也可以使用具有不同名称的类似内容。 :)
关于java - Java 中的 JSON 解析或 String 解析更昂贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46976860/