jackson 意外的标记(FIELD_NAME),应为END_OBJECT:类型信息和反序列化值后应出现结束END_OBJECT

t8e9dugd  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一个接受FileImportInput的API,它具有以下模型

FileImportInput {
    
      private String importType;
      private String resourceUri;
    
      @JsonProperty("settings")
      private MriImportRequest settings;
    }

此MriImportRequest是具有以下字段的基类

@JsonTypeInfo(use = Id.NAME, include = As.WRAPPER_OBJECT, property = "settings")
    @JsonIgnoreProperties(ignoreUnknown = true)
    @JsonSubTypes({
      @JsonSubTypes.Type(value = MriExcelImportRequest.class, name = "sheets"),
      @JsonSubTypes.Type(value = MriTextFileImportRequest.class, name = "files")
    })

   
 public class MriImportRequest {
      private int folderId;
      private String locale;
      private String currency;
    }

以下是具有以下定义的其他两个类。

@JsonTypeName("files")
public class MriTextFileImportRequest extends MriImportRequest {

  private int accountsFileId;
  private int locationsFileId;
  private int reinsuranceFileId;
  private int mappingFileId;
}

另一类如下所示

@JsonTypeName("sheets")
public class MriExcelImportRequest extends MriImportRequest {
  private int accountsSheetIndex;
  private int locationsSheetIndex;
  private int reinsuranceSheetIndex;
  private int mappingFileIndex;}

请求JSON如下,当我提出请求,无法识别的字段“文件”我不知道什么丢失.请求JSON如下

{
    "importType": "mri",
    "resourceUri": "riskdata/v1/exposuresets/es1/exposures/sdfd-2232-skdj-3434/portfolios/12",
    "settings": {
        "files": {
            "accountsFileId": 5387,
            "locationsFileId": 5388,
            "reinsuranceFileId": 5389,
            "mappingFileId": 5390
        },
        "folderId": 1686,
        "currency": "USD",
        "locale": "US"
}
}
ds97pgxw

ds97pgxw1#

JsonTypeInfo.As#WRAPPER_OBJECT用于序列化,当你试图反序列化你的json时,所以在这种情况下没有使用它。相反,你可以使用JsonTypeInfo.Id#DEDUCTION来根据可用的字段推导类型(在这种情况下,如果 files 属性可用,则值将自动反序列化到MriTextFileImportRequest子类:

@Data
public class FileImportInput {

    private String importType;
    private String resourceUri;
    @JsonProperty("settings")
    private MriImportRequest settings;
}

@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes({
    @JsonSubTypes.Type(value = MriTextFileImportRequest.class)
})
public class MriImportRequest {

    private int folderId;
    private String locale;
    private String currency;
}

@Data
public class MriTextFileImportRequest extends MriImportRequest {
    private Files files;
}

@Data
public class Files {

    private int accountsFileId;
    private int locationsFileId;
    private int reinsuranceFileId;
    private int mappingFileId;
}

然后下面的代码打印json输入文件:

FileImportInput fileImportInput = mapper.readValue(json, FileImportInput.class);
//ok it prints the input json file
System.out.println(mapper.writeValueAsString(fileImportInput));

相关问题