2016-08-09 10 views
1

私のプログラムがREST経由で組み込みスマートコントローラに通話できるようにするHttpMessageConverterを実装しようとしています。私はSensorInfoと呼ばれるJavaオブジェクトを持ってコンマで区切られたキー=値のペアをJavaオブジェクトに変換する

ret=OK,htemp=27.0,hhum=-,otemp=27.0,err=0,cmpfreq=24 

コントローラは、次のような文字列で応答します。

public class SensorInfo { 

    String ret; 
    Double htemp; 
    String hhum; 
    Double otemp; 
    Integer err; 
    Integer cmpfreq; 

    // getters and setters 

} 

コントローラのレスポンスを上記のJavaオブジェクトにマッピングするにはどうすればよいでしょうか?

+0

スプリットコンマによる応答して、等号の後にデータを取得するデータメンバーに格納し、その後、 ? – Li357

+0

このクラスのために特別にやりたいのですか、あるいはたくさんのボイラープレートがプロセスに入ることなくスケールアップできる一般的なソリューションが必要ですか? –

+0

私はスケールアップできる一般的な解決策を望んでいます:) –

答えて

2

文字列を分割し、必要に応じて各要素を割り当てることができます。あなたは持っている:

ret=OK,htemp=27.0,hhum=-,otemp=27.0,err=0,cmpfreq=24 

あなたはmyStrという変数に格納されていることを前提としています。そして、あなたがする必要があるのはこれです:

String[] strSplit = myStr.split(" "); 
SensorInfo info = new SensorInfo(); 
info.ret = afterEquals(strSplit[0]); 
info.htemp = Double.parse(afterEquals(strsplit[1])); 
info.hhum = afterEquals(strSplit[2]); 
info.otemp= Double.parse(afterEquals(strSplit[3])); 
info.err = Integer.parse(afterEquals(strSplit[4])); 
info.cmpfreq = Integer.parse(afterEquals(strSplit[5])); 

あなたはイコールは、上記の作業をするために署名した後、応答の一部を抽出するための方法を宣言します:

private String afterEquals(String input) { 
    input.substring(input.indexOf('=') + 1); 
} 

注意これは前提としていることあなたの応答の順序は固定されています。そうでない場合は、簡単にこれを変更して各引数を見て、それを割り当てる変数を確認することができます。

+1

'input.substring(input.indexOf( '=')+ 1)'はおそらくもっと速いので、より良い 'afterEquals'実装を提供します。 。 – Clashsoft

+0

@Clashsoftが合意した、私は更新されます。 – nhouser9

0

次は実際にエラーが発生しやすくはありませんが、あなたを助けるかもしれないとして、あなたは、エラー処理を追加する必要があります

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class ValueAssigner { 
    // ret=OK,htemp=27.0,hhum=-,otemp=27.0,err=0,cmpfreq=24 
    String ret; 
    Double htemp; 
    String hhum; 
    Double otemp; 
    Integer err; 
    Integer cmpfreq; 

    public static void main(String[] a) { 
     System.out.println(new ValueAssigner("ret=OK,htemp=27.0,hhum=-,otemp=27.0,err=0,cmpfreq=24").getCmpfreq()); 
    } 

    ValueAssigner(String in) { 
     String[] split = in.split(","); 
     for (String s : split) { 
      Method method; 
      String[] keyValue = s.split("="); 
      try { 
       method = this.getClass().getMethod("set" + ucFirst(keyValue[0]), String.class); 
       method.invoke(this, keyValue[1]); 
      } catch (IllegalArgumentException | InvocationTargetException | IllegalAccessException | SecurityException | NoSuchMethodException e) { 
       // e.printStackTrace(); 
       // omitted here 
      } 

     } 
    } 

    private static String ucFirst(String in) { 
     return in.substring(0, 1).toUpperCase() + in.substring(1); 
    } 


    public String getRet() { 
     return ret; 
    } 

    public void setRet(String ret) { 
     this.ret = ret; 
    } 

    public Double getHtemp() { 
     return htemp; 
    } 

    public void setHtemp(String htemp) { 
     this.htemp = Double.parse(htemp); 
    } 

    public String getHhum() { 
     return hhum; 
    } 

    public void setHhum(String hhum) { 
     this.hhum = hhum; 
    } 

    public Double getOtemp() { 
     return otemp; 
    } 

    public void setOtemp(String otemp) { 
     this.otemp = Double.parse(otemp); 
    } 

    public Integer getErr() { 
     return err; 
    } 

    public void setErr(String err) { 
     this.err = Integer.parse(err); 
    } 

    public Integer getCmpfreq() { 
     return cmpfreq; 
    } 

    public void setCmpfreq(String cmpfreq) { 
     this.cmpfreq = Integer.parse(cmpfreq); 
    } 
} 
関連する問題