当对象名称中包含DOT时如何从json对象中检索字段值

OverrockSTAR

我想使用以下方法从json下面提取“ msg”值fasterxml.jackson-有人可以建议我我的模型类看起来如何吗?

{
    "statusCode": 422,
    "error": "Unprocessable Entity",
    "message": "Bad data received",
    "err_data": {
        "payment_details.type": {
            "location": "body",
            "param": "payment_details.type",
            "msg": "Must be either etransfer or cheque"
        }
    }
}

这是我所做的,但始终返回“ null”!

@JsonInclude(JsonInclude.Include.ALWAYS)
public class MyApiResponse extends ParentResponse implements Serializable {
    private static final long serialVersionUID = 1L;

    @JsonProperty("payment_details")
    private PaymentDetails payment_details;

    @JsonProperty("payment_details")
    public PaymentDetails getPayment_details() {
        return payment_details;
    }

    @JsonProperty("payment_details")
    public void setPayment_details(PaymentDetails payment_details) {
        this.payment_details = payment_details;
    }
}

ParentResponse模型类扩展了ErrorResponse模型类,这就是它的样子。

ErrorResponse模型表示上述JSON。

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ErrorResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonProperty("statusCode")
    private int statusCode;

    @JsonProperty("error")
    private String error;

    @JsonProperty("message")
    private String message;

    @JsonProperty("err_data")
    private ErrData err_data;

    @JsonProperty("statusCode")
    public int getStatusCode() {
        return statusCode;
    }

    @JsonProperty("statusCode")
    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    @JsonProperty("message")
    public String getMessage() {
        return message;
    }

    @JsonProperty("message")
    public void setMessage(String message) {
        this.message = message;
    }

    @JsonProperty("error")
    public String getError() {
        return error;
    }

    @JsonProperty("error")
    public void setError(String error) {
        this.error = error;
    }

    @JsonProperty("err_data")
    public ErrData getErr_data() {
        return err_data;
    }

    @JsonProperty("err_data")
    public void setErr_data(ErrData err_data) {
        this.err_data = err_data;
    }
}

err_data 对象由下面的模型类表示。

@JsonInclude(JsonInclude.Include.ALWAYS)
public class ErrData implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonProperty("email")
    private Email email;

    @JsonProperty("payment_details.type")
    private PaymentDetailsType payment_details_type;

    @JsonProperty("email")
    public Email getEmail() {
        return email;
    }

    @JsonProperty("email")
    public void setEmail(Email email) {
        this.email = email;
    }

    @JsonProperty("payment_details.type")
    public PaymentDetailsType getPayment_details_type() {
        return payment_details_type;
    }

    @JsonProperty("payment_details.type")
    public void setPayment_details_type(PaymentDetailsType payment_details_type) {
        this.payment_details_type = payment_details_type;
    }
}

payment_details.type 下层类表示的对象。

@JsonInclude(JsonInclude.Include.ALWAYS)
public class PaymentDetailsType extends ErrorMessage implements Serializable {

    private static final long serialVersionUID = 1L;

}

@JsonInclude(JsonInclude.Include.ALWAYS)
public class Email extends ErrorMessage implements Serializable {

    private static final long serialVersionUID = 1L;

}

最后ErrorMessage扩展PaymentDetailsType如下。

@JsonPropertyOrder({"location", "param", "value", "msg"})
public class ErrorMessage implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonProperty("location")
    private String location;

    @JsonProperty("param")
    private String param;

    @JsonProperty("value")
    private String value;

    @JsonProperty("msg")
    private String msg;

    @JsonProperty("location")
    public String getLocation() {
        return location;
    }

    @JsonProperty("location")
    public void setLocation(String location) {
        this.location = location;
    }

    @JsonProperty("param")
    public String getParam() {
        return param;
    }

    @JsonProperty("param")
    public void setParam(String param) {
        this.param = param;
    }

    @JsonProperty("value")
    public String getValue() {
        return value;
    }

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

    @JsonProperty("msg")
    public String getMsg() {
        return msg;
    }

    @JsonProperty("msg")
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

最后,我尝试获取“ msg”字段值,如下所示-

new Gson().fromJson(response.asString(), MyApiResponse.class).getErr_data().getPayment_details_type().getMsg();

我认为这有一个问题-如果json中的字段名称为,则不确定如何定义getter方法。(点)。

@JsonProperty("payment_details.type")
public PaymentDetailsType getPayment_details_type() {
    return payment_details_type;
}

与上面类似,我正在json下面进行操作,以检索“ msg”值,并且工作正常。

{
    "statusCode": 422,
    "error": "Unprocessable Entity",
    "message": "Bad data received",
    "err_data": {
        "email": {
            "location": "body",
            "param": "email",
            "value": "test @ com",
            "msg": "Must be a valid email"
        }
    }
}

这将返回正确的“ msg”值。

new Gson().fromJson(response.asString(), MyApiResponse.class).getErr_data().getEmail().getMsg();

请提出建议!

谢谢。

马诺斯·尼古拉迪斯(Manos Nikolaidis)

这是一个最小的示例,显示了如何使用Jackson解析JSON,其中属性名称可能包含点:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

class Main {
    public static void main(String[] args) throws IOException {
        String json = "{" +
                      "    \"payment_details.type\": {" +
                      "        \"location\": \"body\"" +
                      "    }" +
                      "}";
        ObjectMapper mapper = new ObjectMapper();
        Response response = mapper.readValue(json, Response.class);
        System.out.println(response.getPaymentDetailsType().getLocation());
    }
}

class Response {
    @JsonProperty("payment_details.type")
    private PaymentDetailsType paymentDetailsType;

    public PaymentDetailsType getPaymentDetailsType() { return paymentDetailsType; }
}

class PaymentDetailsType {
    private String location;

    public String getLocation() { return location; }
}

请注意,只有@JsonProperty在无法从设置器或变量名称中推断出JSON中的期望属性名称时,才需要

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在for循环中检索R中的Seurat对象名称

Android:如何从可能更改对象名称的JSON响应中检索多个JSON对象?

在changeHandler中创建对象名称和值

卡在Json API调用中的DateTime对象名称

如何在C ++中更改JSON对象名称而不更改其值?

检索对象名称

空手道:如果对象名称包含数组中的句点,如何设置Json值

如何通过对象名称动态检索对象属性?

添加到列表中时如何生成新的对象名称

JavaScript中对象名称-值的冗余代码

从sequelize.js包含错误的对象名称中,从数据到数据的JSON响应中的方法

如何在NodeJ中创建动态对象名称

从Java中的JSON对象检索类型未知的字段的值

如何在javascript或/和jquery中获取“ this”的对象名称?

删除时sql中的对象名称无效

在$ scope中定义AngularJS变量时使用对象名称

如何在Django中通过queryset获取对象名称

如何更改json对象名称(键)?

如何在对象列表中检索名称和值

在Android中查找MyPagerAdapter对象名称,如何?

在Java中创建对象名称时,如何获取?

当我不知道JSON对象名称时,如何在MVC控制器中获取JSON数据?

如何在 CreateJS 中打印对象名称

如何在 Django 中更改表对象名称?

如何从 JSON 对象中检索多个值

如何在 JavaScript 中获取对象的对象名称

使用“对象名称中的键”时设置键类型

如何使用 JSON.NET 将 JSON 数组中的对象名称用作属性值?

当对象名称是数字时如何解析 JSON?