用JsonSlurper解析多个json的最佳方法

时间:2019-03-27 08:35:14

标签: json groovy

我正在使用Groovy JsonSlurper解析json。我发现我应该在调用JsonSlurper方法之前初始化parseText()实例。

  1. 当我要解析多个json对象(例如,带有LinkedList<String> json文本的n时,应该初始化n JsonSlurper还是初始化{{ 1}},并拨JsonSlurper parseText次?

  2. 当我在Web服务器上使用n时,最好的方法是仅维护一个全局JsonSlurper实例并在各处使用它?还是在每次收到HTTP请求时初始化实例?

或更明确地说,JsonSlurper的构造函数做什么?

1 个答案:

答案 0 :(得分:2)

您可以将JsonSlurper视为创建具体JSON解析器实现的基础。例如,您每次调用parse()parseText()方法时都会创建的默认解析器是JsonParserCharArray。如果查看JsonSlurper源代码,您会发现它封装了以下五个私有字段:

    private int maxSizeForInMemory = 2000000;
    private boolean chop = false;
    private boolean lazyChop = true;
    private boolean checkDates = true;

    private JsonParserType type = JsonParserType.CHAR_BUFFER;

创建JsonSlurper时会使用这些默认值,但是对于任何特定的用例,都可以对其进行修改以最适合您的需求。

回答您的第一个问题,实例化单个JsonSlurper并在迭代列表时解析所有String确实很有意义。像这样:

def slurper = new JsonSlurper()
def parsed = jsons.collect { slurper.parseText(it) }

假设您的列表大小为1000,它将创建一个JsonSlurper对象和1000 JsonParser对象,而不是1000 JsonSlurper对象和1000 JsonParser对象。

回答您的第二个问题,这个问题没有很好的上下文无关的答案。它在很大程度上取决于一些因素,例如服务器负载,JSON序列化/反序列化频率,可用内存,JsonSlurper用例等。实际上,您必须监视您的应用程序并尝试两种方法,才能找到最适合您的方法。例如,如果您的应用程序不断处理HTTP请求,并且不断创建相同的JsonSlurper并使用完全相同的默认值,那么您可以考虑创建一个注入了JsonSlurper相同实例的类单例bean处理每个HTTP请求。但是另一方面,如果您的应用程序没有遭受大量并行请求,并且平均处理一些顺序请求,那么将JsonSlurper对象始终保留在内存中听起来可能是浪费资源。