首页 > 解决方案 > 如何从Java中的JSON映射另一个对象中的对象数组

问题描述

我需要调用一个 APIRestTemplate来获取应该自动转换为 Java 对象的 JSON。

示例 JSON 如下所示

{
    "ParsedResults": [
        {
            "TextOverlay": {
                "Lines": [],
                "HasOverlay": false,
                "Message": "Text overlay is not provided as it is not requested"
            },
            "TextOrientation": "0",
            "FileParseExitCode": 1,
            "ParsedText": "Translated message",
            "ErrorMessage": "",
            "ErrorDetails": ""
        }
    ],
    "OCRExitCode": 1,
    "IsErroredOnProcessing": false,
    "ProcessingTimeInMilliseconds": "1296",
    "SearchablePDFURL": "Searchable PDF not generated as it was not requested."
}

当我调用所需的 API 时,我还创建了一个类来映射所有数据(为清楚起见,不包括 getter 和 setter)。

public class OCRResponse {

    @JsonProperty("ParsedResults")
    private List<ParsedResults> parsedResults;

    @JsonProperty("OCRExitCode")
    private String OCRExitCode;

    @JsonProperty("IsErroredOnProcessing")
    private boolean isErroredOnProcessing;

    @JsonProperty("ProcessingTimeInMilliseconds")
    private Long processingTimeInMilliseconds;

    @JsonProperty("SearchablePDFURL")
    private String searchablePDFURL;
}

上面的类包括一个由以下字段组成的对象集合,它应该表示一个 JSON 格式的数组。

public class ParsedResults {

    @JsonProperty("TextOverlay")
    private TextOverlay textOverlay;

    @JsonProperty("TextOrientation")
    private String textOrientation;

    @JsonProperty("FileParseExitCode")
    private String fileParseExitCode;

    @JsonProperty("ParsedText")
    private String parsedText;

    @JsonProperty("ErrorMessage")
    private String errorMessage;

    @JsonProperty("ErrorDetails")
    private String errorDetails;
}

这个文件还有一个由我制作的类来映射我的 JSON 的另一部分,但我不知道它是否重要,所以除非有人需要,否则我不会粘贴它。

现在,问题是,如果我启动我的应用程序并进行调用,该OCRResponse对象将拥有除对象之外的所有数据ParsedResults

OCRResponse response = restTemplate.getForEntity(uriBuilder.toUriString(), OCRResponse.class).getBody();
System.out.println(response.getSearchablePDFURL());             //null (correct)
System.out.println(response.isErroredOnProcessing());           //true (correct)
System.out.println(response.getProcessingTimeInMilliseconds()); //406  (correct)
System.out.println(response.getOCRExitCode());                  //99   (correct)
System.out.println(response.getParsedResults());                //null (invalid result)

我试图改变List<ParsedResults> parsedResults

ArrayList<ParsedResults> parsedResults;
ArrayList<ParsedResults> parsedResults = new ArrayList<>();
ParsedResults[] parsedResults;
ParsedResults parsedResults //As I should get only one element in my collection anyway

但这些都不起作用,我经常得到NullPointerExceptionIndexOutOfBoundsException

我很确定使用这种方法可以实现我的目标,因为如果我没记错的话,我在学习期间也做过类似的事情。有人可以帮我弄清楚这里出了什么问题吗?

标签: javajsonspringmappingresttemplate

解决方案


推荐阅读