web-dev-qa-db-ja.com

Spring Boot-JSON Object Array to Java Array

私はこのJSONを例として使用するスプリングブートのエンドポイントを持っています:

{
    "userId": 3,
    "postBody": "This is the body of a post",
    "postTitle": "This is the title of a post",
    "created": null,
    "tagList": ["tag1", "tag2", "tag3"]
}

エンドポイント:

  @RequestMapping(value="/newPost", method = RequestMethod.POST, produces="application/json", consumes = "application/json")
  @ResponseBody
  public ResponseEntity newPost(@RequestBody Map<String, Object> body) throws Exception {

ここでの問題は、リクエストの本文がオブジェクトのマップとして保存されていることです。これは、tagListを除く他のすべての属性に適しています。 tagListをJavaの文字列の配列にするにはどうすればよいですか?

ありがとう。

AnkurとJoseの回答が混ざり合ってこれを解決しました。迅速な対応のおかげです!

6
decprog

おそらく、入力JSONを表すJavaクラスを作成し、メソッドnewPost(.....)で使用する必要があります。例:-

public class UserPostInfo {

    private int userId;
    private String postBody;
    private String postTitle;
    private Date created;
    private List<String> tagList;
}

また、このクラスにgetter/setterメソッドを含めます。 JSON解析の動作を変更する場合は、アノテーションを使用してフィールド名を変更したり、null以外の値のみを含めたりすることができます。

5
Ankur Chrungoo

カスタムPOJOを使用したくない場合は、自分でマップへの逆シリアル化を処理することもできます。コントローラーでStringを受け入れてから、ジャクソンのObjectMapperTypeReferenceとともに使用して、マップを取得してください。

@RequestMapping(value="/newPost", method = RequestMethod.POST, produces="application/json", consumes = "application/json")
@ResponseBody
public ResponseEntity newPost(@RequestBody String body) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {};
    HashMap<String,Object> map = mapper.readValue(body, typeRef);
}

結果のHashMapは、タグリストにArrayListを使用します。

enter image description here

2
Mike

カスタムのJava String[]List<String>を使用するリクエストのPOJOを作成できます。ここでは、サイト jsonschema2pojoを使用して作成しました]

package com.stackoverflow.question;

import com.fasterxml.jackson.annotation.*;

import Java.util.HashMap;
import Java.util.Map;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "userId",
        "postBody",
        "postTitle",
        "created",
        "tagList"
})
public class MyRequest {

    @JsonProperty("userId")
    private int userId;
    @JsonProperty("postBody")
    private String postBody;
    @JsonProperty("postTitle")
    private String postTitle;
    @JsonProperty("created")
    private Object created;
    @JsonProperty("tagList")
    private String[] tagList = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("userId")
    public int getUserId() {
        return userId;
    }

    @JsonProperty("userId")
    public void setUserId(int userId) {
        this.userId = userId;
    }

    @JsonProperty("postBody")
    public String getPostBody() {
        return postBody;
    }

    @JsonProperty("postBody")
    public void setPostBody(String postBody) {
        this.postBody = postBody;
    }

    @JsonProperty("postTitle")
    public String getPostTitle() {
        return postTitle;
    }

    @JsonProperty("postTitle")
    public void setPostTitle(String postTitle) {
        this.postTitle = postTitle;
    }

    @JsonProperty("created")
    public Object getCreated() {
        return created;
    }

    @JsonProperty("created")
    public void setCreated(Object created) {
        this.created = created;
    }

    @JsonProperty("tagList")
    public String[] getTagList() {
        return tagList;
    }

    @JsonProperty("tagList")
    public void setTagList(String[] tagList) {
        this.tagList = tagList;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}
1
Jose Martinez