web-dev-qa-db-ja.com

Spring RESTfulサービスでのカスタムJSONオブジェクトの生成と消費

JavaオブジェクトのJSON表現よりも複雑なJSONオブジェクトがいくつかあります。これらのJSONオブジェクトを作成するメソッドがあり、これらを直接取得して使用したいと思います。 org.json私のJSONを構築するためのライブラリ。 JSONオブジェクトをGETとして返すことにより、Stringメソッドを動作させることができます。これは正しい方法ですか?

@RequestMapping(value = "/getjson", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public String getJson() {
    JSONObject json = new JSONObject();
     JSONObject subJson = new JSONObject();
    subJson .put("key", "value");
    json.put("key", subJson);
    return json.toString();
}

ここで、JSONオブジェクトの使用方法を知りたいですか?文字列としてJSONオブジェクトに変換しますか?

    @RequestMapping(value = "/post", method = RequestMethod.POST, produces="application/json", consumes="application/json")
    @ResponseBody
    public String post(@RequestBody String json) {
        JSONObject obj = new JSONObject(json);
        //do some things with json, put some header information in json
        return obj.toString();
    }

これは私の問題を解決する正しい方法ですか?私は初心者なので、もっとうまくやれることを教えてください。注:POJOを返品したくありません。

18
user592748

ジャクソンライブラリを使用すると、次のようなことができると思います。

@RequestMapping(value = "/getjson", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public String getJson() {
   //your logic
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(json);
}

@RequestMapping(value = "/post", method = RequestMethod.POST, produces="application/json", consumes="application/json")
@ResponseBody
public String post(@RequestBody String json) {
    POJO pj = new POJO();
    ObjectMapper mapper = new ObjectMapper();
    pj = mapper.readValue(json, POJO.class);

    //do some things with json, put some header information in json
    return mapper.writeValueAsString(pj);
}
22
RE350

あなたがオブジェクト/ json-json/objectのシリアライズとデシリアライズを心配する必要はないので、私はむしろSpring mvcでジャクソンを使用する代わりになります。しかし、あなたがまだプロセスにしたい場合、私はグーグルのgsonを使用するのが好きです。

http://www.javacreed.com/simple-gson-example/

1
paul

Jackson libを使用できます。jacksonでは、spring mvcを使用してjsonとの間で変換できます。

  1. @ ResponseBody JSON形式のスプリング設定
  2. Jackson 2.0 with Spring 3.1
1
kemenov

デフォルトのSpringブートBeanを使用して自動シリアル化と逆シリアル化を機能させることができませんでした。最後に、Project LombokとApache BeanUtilsを含めた後、これはうまく機能しました。 Springは、シリアル化を自動的に実行できない場合、String argコンストラクターを呼び出します。

@PostMapping("/create")
@ResponseBody
public User createUser(HttpServletRequest request, @RequestParam("user") User u) throws IOException {

    LOG.info("Got user! " + u);

    return u;
}


@ToString() @Getter() @Setter() @NoArgsConstructor()
public class User {
    private String email;
    private String bio;
    private String image;
    private String displayName;
    private String userId;
    private long lat;
    private long lng;

    public User(String json) throws JsonParseException, JsonMappingException, IOException, IllegalAccessException, InvocationTargetException {
        ObjectMapper om = new ObjectMapper();
        User u = om.readValue(json, User.class);
        BeanUtils.copyProperties(this, u);
    }
}

http://commons.Apache.org/proper/commons-beanutils/download_beanutils.cgihttps://projectlombok.org/