java - 将 json token (byte[]) 作为流读取

标签 java json jackson

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

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

我想以流的形式获取byteProp。我从 JacksonStreamingApi 开始并假设我应该创建解析器,例如:

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

问题是我看不到将我的 byteProp 作为流获取的机会,获取此属性的唯一方法是使用类似的东西(假设我们使用正确的 token )

jParser.getBinaryValue()

这仍然会将所有 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()));

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

关于java - 将 json token (byte[]) 作为流读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30253088/

相关文章:

java - 监控java中的进程

java - java.lang.String 中的 NullPointerException

java - Jackson 延迟反序列化字段

java - Jackson 根据字段值添加包装器

python - pycurl 只得到部分响应

json - RESTEasy 和 Jackson 提供程序无法将带有 @XmlIDREF 和 @XmlID 的实体序列化为 JSON

Java EE api邮件发送邮件时出错

java - JVM实际上是如何读取并运行字节码的?一个巨大的 switch-case 语句?

java - JSONArray 数据不会显示在 Fragment 上

json - 如何从 firebase 中的键值对中获取唯一的键?