【问题标题】:Improved way to convert nested JSON object's boolean values into a Map with Jackson使用 Jackson 将嵌套 JSON 对象的布尔值转换为 Map 的改进方法
【发布时间】:2020-04-03 02:36:37
【问题描述】:

我有以下 JSON 对象

{
  "donor": "Y",
  "bloodType": null,
  "eligibility": {
    "categoryEligible": false,
    "suspensionEligible": false,
    "paidFinesEligible": false,
    "pointSystemEligible": false,
    "failedDocuments": [
      {
        "type": "SOMETHING",
        "reason": "SOMETHING_ELSE"
      }
    ],
    "eligible": false,
  }
}

我正在使用 Jackson 将其转换为我的域对象。以下是我正在使用的字段:

    private String donor;

    @JsonProperty("eligibility")
    private Eligibility eligibility;

Eligibility 类包含所有这些字段,我希望 拥有单个 Map 而不是为所有布尔值设置单独的字段,其中 String 是属性名称和布尔值是价值。



    @JsonProperty("failedDocuments")
    private List<FailedDocumentsItem> failedDocuments;

    @JsonProperty("eligible")
    private boolean eligible;

    @JsonProperty("donor")
    private boolean donor;

【问题讨论】:

    标签: java spring spring-boot jackson jackson-databind


    【解决方案1】:

    添加@JsonAnySetter 字段(Jackson 2.8+)或方法:

    可用于定义逻辑“任何设置器”修改器的标记注释 - 使用非静态双参数方法(属性的第一个参数名称,要设置的第二个值)或字段(Map 类型或 POJO) - 用作从 JSON 内容中找到的所有其他无法识别的属性的“后备”处理程序。

    为简洁起见使用公共字段的示例。

    public class Test {
        public static void main(String[] args) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
            Root root = mapper.readValue(new File("test.json"), Root.class);
            System.out.println("donor = " + root.donor);
            System.out.println("flags = " + root.eligibility.flags);
            System.out.println("failedDocuments = " + root.eligibility.failedDocuments);
        }
    }
    class Root {
        public Boolean realId;
        public String donor;
        public Boolean bloodType;
        public Boolean selectiveServiceCandidate;
        public Eligibility eligibility;
    }
    class Eligibility {
        @JsonAnySetter
        public Map<String, Boolean> flags = new HashMap<>();
        public List<FailedDocument> failedDocuments;
    }
    class FailedDocument {
        public String type;
        public String reason;
        @Override
        public String toString() {
            return "FailedDocument[type=" + this.type + ", reason=" + this.reason + "]";
        }
    }
    

    输出

    donor = Y
    flags = {paidFinesEligible=false, hasRealId=false, suspensionEligible=false, acaaEligible=false, eligibleIgnoreRenewalDate=false, eligibleDocuments=false, cardStatusEligible=false, expirationDateEligible=false, eligible=false, citizenEligible=false, pointSystemEligible=false, ageEligible=false, gravamenesEligible=false, categoryEligible=false, eligibleMedical=false}
    failedDocuments = [FailedDocument[type=CERTIFICATE_CITIZENSHIP, reason=MISSING]]
    

    【讨论】:

    • 感谢您提供如此出色的解决方案,非常感谢。
    猜你喜欢
    • 2012-02-13
    • 2019-04-05
    • 2015-06-03
    • 2013-11-19
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多