是否有任何JSON
库(读者)可以进行字符串提取," pull"样式(按记录记录),来自数据源(例如InputStream
),而不完全解析输入到对象中?
例如,考虑在一行中包含以下3条JSON
条记录的文件:
{"a":"b"}{"c":"d"}{"e":"f"}
这些可以分为3行,JSON
也可以有多行记录,如
{
"a":"b"
}
我们需要的是一个JSON字符串&#34; reader&#34;可以按需记录所有输入(类似于Iterator<String>
对象),逐个记录(即StAX,而不是SAX)。例如,在具有3个记录的上述情况中,输出将连续
reader.next() --> {"a":"b"}
reader.next() --> {"c":"d"}
reader.next() --> {"e":"f"}
一种技术是使用一个库来解析对象中的记录(例如,像Jackson中的JsonNode
对象),然后从提取的对象中检索字符串版本,但是只读取这个有不必要的解析开销。
答案 0 :(得分:1)
是的,Jackson 可以使用 JsonParser 来解决这个问题。
例如,将 myfile.txt 包含以下内容:
{"a":"b"}
{
"c":"d"
}{"e":"f"}
以下程序将输出:
{"a":"b"}
{"c":"d"}
{"e":"f"}
代码:
public class Reader implements Closeable {
JsonFactory jsonFactory = new JsonFactory();
JsonParser jp;
public Reader(InputStream inputStream) throws IOException {
jp = jsonFactory.createParser(inputStream);
jp.nextToken();
}
public String next() throws IOException {
while (jp.currentToken() != JsonToken.START_OBJECT){
jp.nextToken();
}
jp.nextToken(); //Next token will be the key
if (jp.currentToken() == JsonToken.FIELD_NAME){
StringBuilder sb = new StringBuilder().append("{\"")
.append(jp.getCurrentName())
.append("\":\"");
jp.nextToken();//Next token will be the value.
sb.append(jp.getValueAsString())
.append("\"}");
return sb.toString();
}
return null;
}
public void close() throws IOException {
jp.close();
}
public static void main(String args[]) throws IOException {
Reader reader = new Reader(new FileInputStream("myfile.txt"));
while (true){
String token = reader.next();
if (token == null){
break;
}
System.out.println(token);
}
}
}
依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.1</version>
</dependency>