首页 > 解决方案 > 是否可以使用 Spring Boot 将嵌套的 Json 数组存储到数据库?

问题描述

这是我的 Json 格式

[ {
        "basicInfo": {
           "uniqueFileNo": "123456tf",
           "actualOrgid": "3",
           "tRefNo": "Test Tender 1",
           "tType": "Open Tender",
           "tFormContract": "Works",
           "tNoOfCovers": "2",
           "tTenderCategory": "Works",
           "tNoOfBidOpeners": "2 Off 2",
           "tAllowAutomaticEvaluation": "false",
           "tAllowMultiCurrencyForBoq": "false",
           "creatorName": "Wils",
           "creatorReference": "WilsDG"
        },
        "multiCurrencyForBoq": "",
        "boqinfo": "",
        "coverinfo": {
           "cover": [
              {
                 "tCoverNo": "1",
                 "tDocDesc": "Scanned Fee Details",
                 "tDocType": ".pdf"
              },
               {
                 "tCoverNo": "2",
                 "tDocDesc": "UnScanned Fee Details",
                 "tDocType": ".csv"
              }
           ]
        }
        }
  ]

我几乎完成了但是,在保存cover**array Structure 时遇到问题 ** 帮我解决这个问题

错误是

Cannot deserialize value of typecom.demo.model.Cover from Array value (tokenJsonToken.START_ARRAY) at [Source: (BufferedInputStream); line: 19, column: 25] (through reference chain: java.util.ArrayList[0]->com.demo.model.TenderBasicDetails["coverinfo"]->com.demo.model.CoverInfo["cover"])

请帮我解决这个问题,伙计们 谢谢

标签: arraysjsonspring-bootjsonparser

解决方案


由于您没有提供代码,我真的不知道出了什么问题,但这可能是您定义属性和/或类结构的方式:

笔记:

使用@JsonIgnoreProperties(ignoreUnknown = true)是因为我不想定义您在 JSON 中拥有的每个元素

@DataLombok 注释,但是您可以创建 Getter/Setters

@JsonProperty确保 JSON 字段名称映射到类字段。

应该是这样的:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Wrapper{
    private BasicInfo basicInfo;
    private String multiCurrencyForBoq;
    private String boqinfo;
    private CoverInfo coverinfo;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class BasicInfo{

    private String uniqueFileNo;
    private String actualOrgid;
    private String tRefNo;
}
@Data
public class CoverInfo{
    private List<CoverDetails> cover = new ArrayList<>();
}

@Data
public class CoverDetails{

    @JsonProperty("tCoverNo")
    private String tCoverNo;

    @JsonProperty("tDocDesc")
    private String tDocDesc;

    @JsonProperty("tDocType")
    private String tDocType;

}

public static void main(String[] args) throws Exception{

    ObjectMapper objectMapper  = new ObjectMapper();
    String json = "[ {\n" +
            "        \"basicInfo\": {\n" +
            "           \"uniqueFileNo\": \"123456tf\",\n" +
            "           \"actualOrgid\": \"3\",\n" +
            "           \"tRefNo\": \"Test Tender 1\",\n" +
            "           \"tType\": \"Open Tender\",\n" +
            "           \"tFormContract\": \"Works\",\n" +
            "           \"tNoOfCovers\": \"2\",\n" +
            "           \"tTenderCategory\": \"Works\",\n" +
            "           \"tNoOfBidOpeners\": \"2 Off 2\",\n" +
            "           \"tAllowAutomaticEvaluation\": \"false\",\n" +
            "           \"tAllowMultiCurrencyForBoq\": \"false\",\n" +
            "           \"creatorName\": \"Wils\",\n" +
            "           \"creatorReference\": \"WilsDG\"\n" +
            "        },\n" +
            "        \"multiCurrencyForBoq\": \"\",\n" +
            "        \"boqinfo\": \"\",\n" +
            "        \"coverinfo\": {\n" +
            "           \"cover\": [\n" +
            "              {\n" +
            "                 \"tCoverNo\": \"1\",\n" +
            "                 \"tDocDesc\": \"Scanned Fee Details\",\n" +
            "                 \"tDocType\": \".pdf\"\n" +
            "              },\n" +
            "               {\n" +
            "                 \"tCoverNo\": \"2\",\n" +
            "                 \"tDocDesc\": \"UnScanned Fee Details\",\n" +
            "                 \"tDocType\": \".csv\"\n" +
            "              }\n" +
            "           ]\n" +
            "        }\n" +
            "        }\n" +
            "  ]";
    System.out.println(objectMapper.readValue(json, new TypeReference<List<Wrapper>>(){}));

  }

日志:

[DemoApplication.Wrapper(basicInfo=DemoApplication.BasicInfo(uniqueFileNo=123456tf, actualOrgid=3, tRefNo=null), multiCurrencyForBoq=, boqinfo=, coverinfo=DemoApplication.CoverInfo(cover=[DemoApplication.CoverDetails(tCoverNo=1, tDocDesc=Scanned Fee Details, tDocType=.pdf), DemoApplication.CoverDetails(tCoverNo=2, tDocDesc=UnScanned Fee Details, tDocType=.csv)]))]

=====已编辑 ============

请清理您的代码:

  • 放置@JsonIgnoreProperties(ignoreUnknown = true)在班级级别,并从所有字段中删除...
  • 如果您使用Lombok @Data,请删除所有 getter/setter
  • 从所有地方删除所有@JsonProperty......
  • 修改你Cover.java有:

@JsonProperty("tCoverNo")
private String tCoverNo;

@JsonProperty("tDocDesc")
private String tDocDesc;

@JsonProperty("tDocType")
private String tDocType;

@JsonProperty 背后的要点是绑定一个名称与 json 字段不同的类字段。

Class Field : blah
Json Field: BLAH
@JsonProperty("BLAH")

推荐阅读