我正在尝试用Java动态解析大量数据。换句话说,我有大量不同类型的数据,因此我将它们放在String或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.
所以不要为80个左右的类(可以在任何给定时间添加/删除/更改更多)执行此操作,我计划将数据放入String或Json String中并解析出值(深度优先)。
我正在使用低端PC(单核Atom处理器),并试图减少我对CPU的负担,因此确定哪个会更快...使用拆分或使用递归JSON进行正则表达式字符串操作解析器。
答案 0 :(得分:1)
让我们讨论你在这里提到的两个案例:
案例1: 使用gson(映射到类)
为每个json输入创建实例和
案例2:创建一个文档(或类似的类型对象)本身并尝试从那里访问数据。
对于案例2,您不需要自己编写解析器:已有解析器可用。 我在这里写下一个杰克逊的例子(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也会提供不同名称的类似内容。 :)