2016-08-09 27 views
1

我試圖實現一個HttpMessageConverter,它可以讓我的程序通過REST與嵌入式智能控制器進行通話。將逗號分隔的key = value對轉換爲Java對象

控制器使用字符串,如響應:

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

我有一個名爲SensorInfo的Java對象。

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); 
    } 
} 
相關問題