私はこの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の回答が混ざり合ってこれを解決しました。迅速な対応のおかげです!
おそらく、入力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以外の値のみを含めたりすることができます。
カスタムPOJOを使用したくない場合は、自分でマップへの逆シリアル化を処理することもできます。コントローラーでString
を受け入れてから、ジャクソンのObjectMapper
をTypeReference
とともに使用して、マップを取得してください。
@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
を使用します。
カスタムの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);
}
}