2017-05-24 5 views
1

私は現在、自分のREST APIを使ってファイルをアップロードするプロジェクトに取り組んでおり、そのサーバーはJSONで次のものを返します。大きすぎるJava - カスタムエラーコードを返します

  • 0アップロード成功
  • 1ファイル
  • 2ファイルに

を救うことができなかった私ができる午前: "コード" を有する可能性の3つの値を持つ

[{"code":0,"id":"19348139481","name":"file.bin"}] 

角かっこを取り除いた後にキー/値の各ペアを得ることができますが、 "コード"とそのメッセージを関連付ける方法はありますか?

System.out.println(code.msg); 
+0

あなたは関数内でswitch文を使うことができ、 'enum'を使うことができます。' Map 'を使うことができます。多くの可能性:私は個人的に配列を使用することを避けるでしょう。なぜなら、連続したコード番号を使うようになるからです( '0'、' 1'、 '2'の後にコード' 99'を使うことはできません)。 switch文はそれほどエレガントではありません。もしあなたがパフォーマンスを気にしていれば、 'Map'が最良の選択でしょう。 – Oneiros

+0

@Oneirosあなたはそれを答えに入れて、あなたのMpa提案を示すコードを追加するべきです。 – fvu

+0

可能な値の列挙されたリストの最適なソリューションは列挙型です。 – chrylis

答えて

1

を使用して、それを呼び出すことができます。例:

public class App { 

    public static void main(String[] args) { 
     for (int responseCode = 0; responseCode <= 2; responseCode++) { 
      UploadResponse response = UploadResponse.getUploadResponse(responseCode); 
      System.out.println(response.getMessage()); 
     } 
    } 

    private enum UploadResponse { 
     SUCCESS(0, "upload successful"), 
     FILE_SIZE_ERROR(1, "file too big"), 
     FILE_SAVE_ERROR(2, "could not save file"); 

     private int code; 
     private String message; 

     private UploadResponse(int code, String message) { 
      this.code = code; 
      this.message = message; 
     } 

     public String getMessage() { 
      return message; 
     } 

     public static UploadResponse getUploadResponse(int code) { 
      for (UploadResponse response : UploadResponse.values()) { 
       if (response.code == code) { 
        return response; 
       } 
      } 

      throw new IllegalArgumentException("Unsupported UploadResponse code: " + code); 
     } 
    } 
} 
0

簡単な解決策かもしれません:私は何をしたいのは、C++

define 0 UPLOAD_SUCCESSFUL 
define 1 FILE_TOO_BIG 
define 2 COULDNT_SAVE_FILE 

のようにコードを私は「コード」私は、対応するメッセージを表示することができますように取得するときにその方法を定義することですリターンコードが実際に0、1、2ですもちろんの場合:

String message[] = {"upload successful","file too big","could not save file"}; 
... 
System.out.println(message[code]); 

追記:I am able to get each pair of key/value after removing the bracketsは実際にあなたが手動でJSONメッセージを分解してコードを取得することを意味している場合:ありません。 JacksonやGSONのような適切なJSON APIを使用してください。 JSONは、今日のコーディング環境において、堅牢で多彩なAPIの学習に投資するのに十分重要です。

+0

実際に私はGSONを使用しますが、[] jsonはエラーを生成します。 JsonObject repCode = new Gson()。fromJson(result.toString()。replaceAll( "[\\ [\\]]"、 "")、JsonObject.class); \t \t System.out.println(repCode.get( "code")。getAsInt()); ディスプレイ:0(たとえば) – retArdos

+0

アップロードの応答は、コードが0と2です。しかし、他の機能ではそうではありませんので、私はそれを使用できません。 – retArdos

+0

エラーは、戻ってくるものが**配列**であるため、そのように扱う必要があるという事実によって引き起こされます。コードを 'JsonObject [] repCode = new Gson().Json(result、JsonObject []。class)に変更することができます。 System.out.println(repCode [0] .get( "code")。getAsInt()); '。入力文字列を変更するよりもはるかにクリーンです。 – fvu

-1

簡単な解決策は、スイッチケースを使用する方法を作成することです。このような何か:可能な戻り値のリストがenumを使用することができ、安定しているので

public static String getCodeMessage(int code) { 
    switch (code) { 
    case 0: return "UPLOAD_SUCCESSFUL"; 
    case 1: return "FILE_TOO_BIG"; 
    case 2: return "COULDNT_SAVE_FILE"; 
    default: return "Uknown code"; 
    } 
} 

次にあなたがSystem.out.println(getCodeMessage(code));

+0

リターンを使用するときは、その必要はありません。 –

+0

ありがとう、それは私が最初にやろうとしていたが、私はそれがあまりにも重くなると思った、特にWebサイトのクエリは、より多くのエラーコードで他の機能を持っている。 おそらくenumと一緒に行くと、私は何ができるかを見ていきます。 – retArdos