JSON读取器将记录提取为Java字符串,无需解析

时间:2015-01-23 02:57:25

标签: java json reader

是否有任何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对象),然后从提取的对象中检索字符串版本,但是只读取这个有不必要的解析开销。

1 个答案:

答案 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>