读取 json 个令牌 (byte[]) 作为流
Read json token (byte[]) as stream
假设我有一些 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 属性 读取为流?
类似这样的东西应该有用,请根据需要进行改进:
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
之类的内容。
假设我有一些 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 属性 读取为流?
类似这样的东西应该有用,请根据需要进行改进:
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
之类的内容。