如何将 json 响应字符串从 java 读取到 Document AI 的 Document 对象中?

How to read json response string into Document object of Document AI from java?

我正在与另一个 API 合作,它调用 google 文档 AI API。我正在尝试将文件中的 JSON 字符串读入 Document 对象。应该怎么做?

我尝试了以下但它不起作用。

import com.google.cloud.documentai.v1.Document;
import java.io.FileInputStream;

Document document = Document.parseFrom(new FileInputStream("src/main/resources/responseFromAPICall.json"));
System.out.println(document.getText());

我收到此错误:

Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
    at com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:129)
    at com.google.protobuf.CodedInputStream$StreamDecoder.checkLastTagWas(CodedInputStream.java:2124)
    at com.google.protobuf.CodedInputStream$StreamDecoder.readGroup(CodedInputStream.java:2358)

今天我也遇到了这个问题。 This answer 给了我解决方案的起点。

如果您的 json 文件是通过调用 Document AI 保存的并且看起来像:

{
  "document": {
    ...
    "text": "...",
    ...
  },
  "humanReviewStatus": {...}
}

您可以使用以下代码片段:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.google.cloud.documentai.v1.Document;
import com.google.cloud.documentai.v1.ProcessResponse;
import com.google.protobuf.util.JsonFormat;

Path filePath = Paths.get("src/main/resources/responseFromAPICall.json");
ProcessResponse.Builder responseBuilder = ProcessResponse.newBuilder();
JsonFormat.parser().merge(Files.newBufferedReader(filePath), responseBuilder);
Document document = responseBuilder.getDocument();
System.out.println(document.getText());

如果您的 json 文件仅包含“文档”对象:

{
  ...
  "text": "...",
  ...
}

这段代码可以解决问题:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.google.cloud.documentai.v1.Document;
import com.google.protobuf.util.JsonFormat;

Path filePath = Paths.get("src/main/resources/responseFromAPICall.json");
Document.Builder docBuilder = Document.newBuilder();
JsonFormat.parser().merge(Files.newBufferedReader(filePath), docBuilder);
System.out.println(docBuilder.getText());