Avatar
0
Thành Vương Beginner
Thành Vương Beginner
Parse Json to Object dùng @JsonProperty
Em đang dùng Rest Template để call 1 api nó trả data JSON dạng:
{
    "Data": [{"ID":"vt", "Name":"vuong"}, {"ID":"ha", "Name":"hoang"}],
    "ErrorCode": null,
    "ErrorMsg": null
}

E có tạo 1 class tên ApiResponse

    @JsonProperty("Data")
    private List<User> data;
    @JsonProperty("ErrorCode")
    private String errorCode;
    @JsonProperty("ErrorMsg")
    private String errorMess; 

Cái list data json thì em tạo 1 class User

    @JsonProperty("ID")
    private String id;
    @JsonProperty("Name")
    private String name;

Khi em goi

ResponseEntity<ApiResult> responseEntity = restTemplate.exchange(
    api,
    HttpMethod.POST,
    httpEntity,
    ApiResult.class
);

và lấy list data

List<User> users = responseEntity.getBody().getData();

thì cái users này nó không map vào với mấy cái field trong class của em.

Em đã dùng sai @JsonProperty ở đây ạ?

  • Answer
json to object
Remain: 5
2 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
Bản chất bên trong spring dùng ObjectMapper, nên anh đã thử tạo 1 chương trình thế này và anh thấy bình thường:

<span>public</span> <span>class</span> ObjectMapperExample {

    <span>public</span> static void main(<span>String</span>[] args) throws Exception {
        <span>String</span> json = <span>"{\n"</span> +
            <span>"    "</span>Data\<span>": [{"</span>ID\<span>":"</span>vt\<span>", "</span>Name\<span>":"</span>vuong\<span>"}, {"</span>ID\<span>":"</span>ha\<span>", "</span>Name\<span>":"</span>hoang\<span>"}],\n"</span> +
            <span>"    "</span>ErrorCode\<span>": null,\n"</span> +
            <span>"    "</span>ErrorMsg\<span>": null\n"</span> +
            <span>"}"</span>;
        ObjectMapper objectMapper = <span>new</span> ObjectMapper();

        System.out.println(objectMapper.readValue(json, ApiResponse.<span>class</span>));
    }

    @ToString
    <span>public</span> static <span>class</span> ApiResponse {
        @JsonProperty(<span>"Data"</span>)
        <span>private</span> List<User> data;
        @JsonProperty(<span>"ErrorCode"</span>)
        <span>private</span> <span>String</span> errorCode;
        @JsonProperty(<span>"ErrorMsg"</span>)
        <span>private</span> <span>String</span> errorMess;
    }

    @ToString
    <span>private</span> static <span>class</span> User {
        @JsonProperty(<span>"ID"</span>)
        <span>private</span> <span>String</span> id;
        @JsonProperty(<span>"Name"</span>)
        <span>private</span> <span>String</span> name;
    }
}

// kết quả là: ObjectMapperExample.ApiResponse(
data=[
ObjectMapperExample.User(id=vt, name=vuong),
ObjectMapperExample.User(id=ha, name=hoang)],
errorCode=null,
errorMess=null
)

Liệu có sự nhầm lẫn nào giữa ApiResponse và ApiResult không em?

  • 0
  • Reply
Liệu có sự nhầm lẫn nào giữa ApiResponse và ApiResult không em?=> chắc là do em đặt tên em sai ý nghĩa.
ResponseEntity responseEntity = restTemplate.exchange(
    api,
    HttpMethod.POST,
    httpEntity,
    ApiResult.class
);

khi em gọi cái này nè a. em cũng chưa dùng objectMapper.readValue(...)

thì cái responseEntity em nhận được đó nó có map vào được từng field trong List data không ạ?

 –  Vo Thanh Vuong 1670015377000
Được em ạ, nếu không đc nó sẽ ném ra exception  –  dungtv 1670015765000
à em nhầm ạ. class ApiResult em đang làm theo kiểu generic
public class ApiResult {
    @JsonProperty("data")
    private List dataList;
    @JsonProperty("errorCode")
    private String code;
    @JsonProperty("errorMess")
    private String mess;
}

thì khi :

ResponseEntity responseEntity = restTemplate.exchange(
    api,
    HttpMethod.POST,
    httpEntity,
    ApiResult.class
);
<pre> 
 ApiResult apiResult = responseEntity.getBody();

nó sẽ ko map được ạ.

 –  Vo Thanh Vuong 1670019518000
Avatar
Vo Thanh Vuong Beginner
  • 0
  • Reply