如何在Java中从JSON映射另一个对象中的对象数组

时间:2020-08-28 15:49:29

标签: java json spring mapping resttemplate

我需要使用RestTemplate调用API以获取JSON,该JSON应自动转换为Java对象。

一个示例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

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

0 个答案:

没有答案