Java 将json标记(字节[])作为流读取

Java 将json标记(字节[])作为流读取,java,json,jackson,Java,Json,Jackson,假设我有一些json响应,比如: { byteProp: [1, 3, 2, ... some very large byte content] } 我想以流的形式获取byteProp。我从一开始就认为应该创建如下解析器: JsonFactory jfactory = new JsonFactory(); JsonParser jParser = jfactory.createJsonParser( myJsonStream); 但问题是,我不认为有机会将我的byteProp获取

假设我有一些json响应,比如:

{
   byteProp: [1, 3, 2, ... some very large byte content]
}
我想以流的形式获取
byteProp
。我从一开始就认为应该创建如下解析器:

JsonFactory jfactory = new JsonFactory();   
JsonParser jParser = jfactory.createJsonParser( myJsonStream);
但问题是,我不认为有机会将我的
byteProp
获取为流,获取此属性的唯一方法是使用类似的东西(假设我们使用了正确的标记)

它仍然会将所有
byteProp
内容提取到内存中,这是我希望避免的情况


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

类似的方法应该可以工作,可以根据需要进行改进:

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()));
根据您的需要,将
替换为tearrayoutputstream
,类似于
文件输出流

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()));