我正在使用Groovy JsonSlurper
解析json。我发现我应该在调用JsonSlurper
方法之前初始化parseText()
实例。
当我要解析多个json对象(例如,带有LinkedList<String>
json文本的n
时,应该初始化n
JsonSlurper
还是初始化{{ 1}},并拨JsonSlurper
parseText
次?
当我在Web服务器上使用n
时,最好的方法是仅维护一个全局JsonSlurper
实例并在各处使用它?还是在每次收到HTTP请求时初始化实例?
或更明确地说,JsonSlurper
的构造函数做什么?
答案 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
对象始终保留在内存中听起来可能是浪费资源。