私は持っています
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
SessionInfo register(UserProfile profileJson){
...
}
私はこのようにprofileJsonを渡します:
http://server/url?profileJson={"email": "[email protected]"}
しかし、私のprofileJsonオブジェクトにはすべてnullフィールドがあります。私のjsonを春を解析するにはどうすればよいですか?
これは、JSONをUserProfileオブジェクトに変換するカスタムエディターで実行できます。
public class UserProfileEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
ObjectMapper mapper = new ObjectMapper();
UserProfile value = null;
try {
value = new UserProfile();
JsonNode root = mapper.readTree(text);
value.setEmail(root.path("email").asText());
} catch (IOException e) {
// handle error
}
setValue(value);
}
}
これは、エディターをコントローラークラスに登録するためのものです。
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(UserProfile.class, new UserProfileEditor());
}
そして、これはエディターを使用してJSONPパラメーターを非整列化する方法です。
@RequestMapping(value = "/jsonp", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
@ResponseBody
SessionInfo register(@RequestParam("profileJson") UserProfile profileJson){
...
}
これに対する解決策はとても簡単でシンプルなので、実際にあなたを笑わせることができますが、私がそれに達する前に、まず自尊心のあるJava開発者は決していません、そして私が意味するJacksonの高性能JSONライブラリを使用せずにJSONを使用してください。
ジャクソンは、Java開発者の仕事馬であり、事実上のJSONライブラリであるだけでなく、Javaケーキ(ジャクソンは http://jackson.codehaus.org/ からダウンロードできます)。
それでは答えを。次のようなUserProfile pojoがあると仮定します。
public class UserProfile {
private String email;
// etc...
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// more getters and setters...
}
...次に、JSON値{"email": "[email protected]"}を持つGETパラメーター名 "profileJson"を変換するSpring MVCメソッドは、コントローラーで次のようになります。
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper; // this is your lifesaver right here
//.. your controller class, blah blah blah
@RequestMapping(value="/register", method = RequestMethod.GET)
public SessionInfo register(@RequestParam("profileJson") String profileJson)
throws JsonMappingException, JsonParseException, IOException {
// now simply convert your JSON string into your UserProfile POJO
// using Jackson's ObjectMapper.readValue() method, whose first
// parameter your JSON parameter as String, and the second
// parameter is the POJO class.
UserProfile profile =
new ObjectMapper().readValue(profileJson, UserProfile.class);
System.out.println(profile.getEmail());
// rest of your code goes here.
}
バム!できました。先ほど言ったように、これは命の恩人なので、Jackson APIの大部分に目を通すことをお勧めします。たとえば、コントローラーからJSONを返しますか?もしそうなら、あなたがする必要があるのはあなたのlibにJSONを含めることです、そしてあなたのPOJOを返すとジャクソンは自動的にそれをJSONに変換します。あなたはそれよりはるかに簡単になることはできません。乾杯! :-)
独自のConverter
を作成し、Springに適切な場所で自動的に使用させることができます。
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
@Component
class JsonToUserProfileConverter implements Converter<String, UserProfile> {
private final ObjectMapper jsonMapper = new ObjectMapper();
public UserProfile convert(String source) {
return jsonMapper.readValue(source, UserProfile.class);
}
}
次のコントローラーメソッドでわかるように、特別なものは必要ありません。
@GetMapping
@ResponseBody
public SessionInfo register(@RequestParam UserProfile userProfile) {
...
}
コンポーネントスキャンを使用している場合、Springはコンバーターを自動的に取得し、コンバータークラスに@Component
。
Spring Converter および Spring MVCでの型変換 の詳細をご覧ください。
これにより、当面の問題は解決しますが、AJAX呼び出しを介して複数のJSONオブジェクトを渡す方法についてはまだ興味があります。
これを行う最適な方法は、渡す2つの(または複数の)オブジェクトを含むラッパーオブジェクトを持つことです。次に、JSONオブジェクトを2つのオブジェクトの配列として作成します。
[
{
"name" : "object1",
"prop1" : "foo",
"prop2" : "bar"
},
{
"name" : "object2",
"prop1" : "hello",
"prop2" : "world"
}
]
次に、コントローラーメソッドで、リクエストの本文を単一のオブジェクトとして受け取り、含まれている2つのオブジェクトを抽出します。すなわち:
@RequestMapping(value="/handlePost", method = RequestMethod.POST, consumes = { "application/json" })
public void doPost(@RequestBody WrapperObject wrapperObj) {
Object obj1 = wrapperObj.getObj1;
Object obj2 = wrapperObj.getObj2;
//Do what you want with the objects...
}
ラッパーオブジェクトは次のようになります...
public class WrapperObject {
private Object obj1;
private Object obj2;
public Object getObj1() {
return obj1;
}
public void setObj1(Object obj1) {
this.obj1 = obj1;
}
public Object getObj2() {
return obj2;
}
public void setObj2(Object obj2) {
this.obj2 = obj2;
}
}