使用 Jackson 注释如何在输出 JSON 中为字段和值获取单独的 JSON 行?

Using Jackson annotations how can I get a separate JSON row for field and value in the output JSON?

我正在调用一个 Web 服务,该服务要求发送给它的数据格式为

{
  "data": [
    {
      "field": "Pol_OwnerName",
      "value": "Policy Owner Name Here"
    },
    {
      "field": "Pol_Number",
      "value": "123456789"
    ]
}

我正在使用 POJO 并使用 @JsonProperty 注释:

@JsonProperty("Pol_OwnerName")
private String policyOwnerName;

@JsonProperty("Pol_Number")
private String policyNumber;

这导致输出的形式为:

{ 
     "Pol_OwnerName":"Policy Owner Name Here"
}

如何使用 Jackson 注释将我的值转换为所需的格式?

我认为您需要为您的请求提供单独的 POJO。您需要转换 Policy class 的内容以匹配所需的请求。您可以像这样创建一个简单的 WebServiceRequest class:

public class WebServiceRequest {
    @JsonProperty("data")
    private List<WebServiceRequestDataEntry> data;

    public List<WebServiceRequestDataEntry> getData() { return data; }

    public void setData(List<WebServiceRequestDataEntry> data) { this.data = data; }
}

这将包含 WebServiceRequestDataEntry 个元素的数组,如下所示:

public class WebServiceRequestDataEntry {
    @JsonProperty("field")
    private String field;
    @JsonProperty("value")
    private String value;

    public WebServiceRequestDataEntry(String field, String value) {
        this.field = field;
        this.value = value;
    }

    public String getField() { return field; }

    public void setField(String field) { this.field = field; }

    public String getValue() { return value; }

    public void setValue(String value) { this.value = value; }
}

然后您可以尝试将您的策略​​ class 内容转换为您的请求负载。我假设您的 class 看起来像这样:

private static class Policy {
    private final String policyOwnerName;
    private final String policyNumber;

    public Policy(String ownerName, String number) {
        this.policyOwnerName = ownerName;
        this.policyNumber = number;
    }

    public String getPolicyOwnerName() { return this.policyOwnerName; }

    public String getPolicyNumber() { return this.policyNumber; }
}

我用这段代码对其进行了测试,它似乎按预期工作:

ObjectMapper objectMapper = new ObjectMapper();
WebServiceRequest webServiceRequest = new WebServiceRequest();

Policy[] policies = new Policy[] { new Policy("User1", "12345")};

List<WebServiceRequestDataEntry> data = new ArrayList<>();
for (Policy p : policies) {
    data.add(new WebServiceRequestDataEntry("Pol_OwnerName", p.getPolicyOwnerName()));
    data.add(new WebServiceRequestDataEntry("Pol_Number", p.getPolicyNumber()));
}
webServiceRequest.setData(data);

System.out.println(objectMapper.writeValueAsString(webServiceRequest));

这将打印以下输出:

{"data":[{"field":"Pol_OwnerName","value":"User1"},{"field":"Pol_Number","value":"12345"}]}