2016-08-09 76 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); 
    } 
} 
相关问题