2016-04-14 5 views
0

JSONObjectを配置しようとするとJSONExceptionが発生します。Restletでの表現の解析

@Post 
public String someCode(Representation rep) throws ResourceException{ 
    try { 
     rep.getText(); 
    } catch (IOException e) { 
     LOGGER.error("Error in receiving data from Social", e); 
    } 

    try { 
     JSONObject json = new JSONObject(rep); 
     String username = json.getString("username"); 
     String password = json.getString("password"); 
     String firstname = json.getString("firstname"); 
     String lastname = json.getString("lastname"); 
     String phone = json.getString("phone"); 
     String email = json.getString("email"); 

     LOGGER.info("username: "+username); //JsonException 
     LOGGER.info("password: "+password); 
     LOGGER.info("firstname: "+firstname); 
     LOGGER.info("lastname: "+lastname); 
     LOGGER.info("phone: "+phone); 
     LOGGER.info("email: "+email); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return "200"; 
} 

ERRORログ:

org.json.JSONException: JSONObject["username"] not found. 
    at org.json.JSONObject.get(JSONObject.java:516) 
    at org.json.JSONObject.getString(JSONObject.java:687) 

注:

私はrep.getText()を印刷しようと、私は次のようなデータを取得する:

username=user1&password=222222&firstname=Kevin&lastname=Tak&phone=444444444&email=tka%40gmail.com 
+1

応答のコンテンツタイプはむしろ 'application/x-www-form-urlencoded'と思われ、' application/json' –

答えて

1

ご担当者OBJEC tはJSONオブジェクトではありません。私は実際にJSONObject()に渡すと、奇妙な文字列しかキャプチャしないと思っています。

Map<String, String> query_pairs = new LinkedHashMap<String, String>(); 
String query = rep.getText(); 
String[] pairs = query.split("&"); 
for (String pair : pairs) { 
    int idx = pair.indexOf("="); 
    query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8")); 
} 
1

あなたが受け取っているのは、JSONではないHTTPフォームでエンコードされたデータです。

Restletは、これらのオブジェクトをネイティブに扱い、それらとやりとりするためのFormオブジェクトを提供できます。むしろnew JSONObject(String)より例えば、new Form(String)を試してみてください。

String data = rep.getText(); 
Form form = new Form(data); 
String username = form.getFirstValue("username"); 

私は読者への課題として残りを残します。

また、この構文の説明については、http://www.json.org/を参照して、JSONでエンコードするためにデータを送信するクライアントを調整する必要があります。

FormクラスはコアRestletライブラリのorg.restlet.data.Formです。

+0

'form.getFirstValue(" username ")'はnullを指定しています。コンテンツタイプがURLのapplication/jsonとコンテンツ本体のjsonを呼び出しています。 –

+0

@MyGod私は上記のコード行を、あなたが出力する 'user1'という入力文字列で実行しました。 Restletを使うことの1つは、getText()を2度呼び出すと、2度目のnullオブジェクトを返すことができるということです。 getText()から結果の表現パスを渡すのではなく.... JSONを送信しているかもしれませんが、ここに到着しているようではありません。私は現在の情報から、道。 – Caleryn