【问题标题】:How to extract particular field value from the json api response using fasterxml.jackson如何使用 fastxml.jackson 从 json api 响应中提取特定字段值
【发布时间】:2018-02-10 05:54:42
【问题描述】:

我的一个 api 响应如下 -

{
   "statusCode": 422,
   "error": "Unprocessable Entity",
   "message": "Bad data received",
   "err_data": {
       "email": {
           "location": "body",
           "param": "email",
           "value": false,
           "msg": "Please provide valid e-mail address"
       }
   }
}

所以,在下面的response.asString() 代表上面的响应体。

ApiResponse response = new Gson().fromJson(response.asString(), ApiResponse.class);

ApiResponse.class是我的模型,如下:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({ "statusCode", "message" })
public class ApiResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonProperty("message")
    private String message;

    @JsonProperty("statusCode")
    private int statusCode;

    @JsonProperty("err_data")
    private List<String> errData = new ArrayList<>();

    @JsonProperty("email")
    private List<String> email = new ArrayList<>();

    @JsonProperty("msg")
    private String msg;

    /**
     * No args constructor for use in serialization
     */
    public ApiResponse() {
    }

    /**
     * @param message
     */
    public ApiResponse(int statusCode, String message, List<String> errData, List<String> email, String msg) {
        this.message = message;
        this.statusCode = statusCode;
        this.errData = errData;
        this.email = email;
        this.msg = msg;
    }

    @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("err_data")
    public List<String> getErrData() {
        return errData;
    }

    @JsonProperty("err_data")
    public void setErrData(List<String> errData) {
        this.errData = errData;
    }

    @JsonProperty("email")
    public List<String> getEmail() {
        return email;
    }

    @JsonProperty("email")
    public void setEmail(List<String> email) {
        this.email = email;
    }

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

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

当我试图在"email":{} 下获取msg 时,它正在返回null

ApiResponse apiResponse = new Gson().fromJson(response.asString(), ApiResponse.class);
// this prints correct value
System.out.println(apiResponse.getMessage()); 

// this prints correct value
System.out.println(apiResponse.getStatusCode());

// this prints empty string array => []
System.out.println(apiResponse.getErrData());

// this also prints empty string array => []
System.out.println(apiResponse.getEmail());

// this prints null
System.out.println(apiResponse.getMsg());

我是 fasterxml.jackson lib 的新手,不确定我缺少什么。

要获得msg 值,我必须在上面的模型类中进行哪些更改。非常感谢您。

【问题讨论】:

    标签: json jackson gson fasterxml


    【解决方案1】:

    这是您的代码不正确的地方:

    @JsonProperty("err_data")
    private List<String> errData = new ArrayList<>();
    
    @JsonProperty("email")
    private List<String> email = new ArrayList<>();
    

    emailerrData 都不是List,它们是单独的Object。就像ApiResponse.java 一样,您需要为这两个对象创建 POJO。例如:

    public class Email {
         private String location;
         private String param;
         private String value;
         private String msg;
         // define getter and setter
    }
    

    public class ErrData {
         private Email email;
         // define getter and setter
    }
    

    然后使用新的类作为对象类型。

    @JsonProperty("err_data")
    private ErrData errData; 
    // email is already inside ErrData, you don't need to define them here
    

    终于可以访问你的msg

    errData.getEmail().getMsg();
    

    希望这足够清楚。祝你好运!

    【讨论】:

    • 感谢您的快速回复!我按照你的建议做了,然后这样做是为了访问消息,但得到了空指针。 ApiResponse apiResponse = new Gson().fromJson(response.asString(), ApiResponse.class); System.out.println(apiResponse.getErrData().getEmail().getMsg());
    • 您是否将@JsonProperty 添加到电子邮件字段?您也应该在其他类上定义它们:D
    • 我现在明白了.. 字段名称不同.. 我不得不重命名 getter 方法名称 - @JsonProperty("err_data") public ErrData getErr_data() { return err_data; } 现在工作正常。 System.out.println(apiResponse.getErr_data().getEmail().getMsg());
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多