读取json标记(byte [])作为流

时间:2015-05-15 06:40:01

标签: java json jackson

让我们说我有一些json响应:

{
   byteProp: [1, 3, 2, ... some very large byte content]
}

我想将byteProp作为流提取。我从JacksonStreamingApi开始,并假设我应该创建解析器:

JsonFactory jfactory = new JsonFactory();   
JsonParser jParser = jfactory.createJsonParser( myJsonStream);

Bu问题是我没有看到机会得到我的byteProp作为流,只有获得此属性的方法是使用......(假设我们在正确的令牌上)

jParser.getBinaryValue()

仍会将所有byteProp内容提取到内存中,这是我想避免的情况。

有没有办法将单个json属性读作流?

1 个答案:

答案 0 :(得分:2)

这样的事情应该有效,并在你认为合适时进行改进:

ByteArrayOutputStream os = new ByteArrayOutputStream();

JsonFactory jfactory = new JsonFactory();
JsonParser jParser = jfactory.createJsonParser(new FileInputStream(new File("data/json.json")));

if (jParser.nextToken() != JsonToken.START_OBJECT) {
    return;
}
while (jParser.nextToken() != JsonToken.END_OBJECT) {
    String fieldName = jParser.getCurrentName();

    jParser.nextToken();
    if (fieldName.equals("byteProp")) {
        byte[] bytes = new byte[1024];
        int read = 0;
        while (jParser.nextToken() != JsonToken.END_ARRAY) {
            if (read >= bytes.length) {
                os.write(bytes, 0, read);
                os.flush();
                bytes = new byte[1024];
                read = 0;
            }

            bytes[read++] = jParser.getByteValue();
        }
        if (read >= 0) {
            os.write(bytes, 0, read);
            os.flush();
        }
    }
}

System.out.println(new String(os.toByteArray()));

根据您的需要,将ByteArrayOutputStream替换为FileOutputStream之类的内容。