今天在使用阿里的JSON将一个集合转换成一个json格式的字符串,但是,查看结构却发现不是自己想要的结果,具体的过程请看下面:
首先,我定义了一个实体了swdz:
static class SWDZ {
public String pk_id;
public String minecode;
public String minename;
public String station_code;
public String address_name;
public String station_name;
public String monitoring_type_code;
public String monitoring_type;
public String jctime;
public String jcvalue;
public String zdflag;
public String JLDW;
public String getPk_id() {
return pk_id;
}
public void setPk_id(String pk_id) {
this.pk_id = pk_id;
}
public String getMinecode() {
return minecode;
}
public void setMinecode(String minecode) {
this.minecode = minecode;
}
public String getMinename() {
return minename;
}
public void setMinename(String minename) {
this.minename = minename;
}
public String getStation_code() {
return station_code;
}
public void setStation_code(String station_code) {
this.station_code = station_code;
}
public String getAddress_name() {
return address_name;
}
public void setAddress_name(String address_name) {
this.address_name = address_name;
}
public String getStation_name() {
return station_name;
}
public void setStation_name(String station_name) {
this.station_name = station_name;
}
public String getMonitoring_type_code() {
return monitoring_type_code;
}
public void setMonitoring_type_code(String monitoring_type_code) {
this.monitoring_type_code = monitoring_type_code;
}
public String getMonitoring_type() {
return monitoring_type;
}
public void setMonitoring_type(String monitoring_type) {
this.monitoring_type = monitoring_type;
}
public String getJctime() {
return jctime;
}
public void setJctime(String jctime) {
this.jctime = jctime;
}
public String getJcvalue() {
return jcvalue;
}
public void setJcvalue(String jcvalue) {
this.jcvalue = jcvalue;
}
public String getJLDW() {
return JLDW;
}
public void setJLDW(String JLDW) {
this.JLDW = JLDW;
}
public String getZdflag() {
return zdflag;
}
public void setZdflag(String zdflag) {
this.zdflag = zdflag;
}
}
进行测试一个案例:
List<SWDZ> dataList=new ArrayList<SWDZ>();
String[] CDLXNAME={"水位", "水压", "水温","流量"};
String[] CDLXCODE={"02001", "02002", "02003","04002"};
String[] JLDW={"m", "Mpa", "°C","m3/h"};
String jsondata=null;
String kafkadata="150623B0012000900004,长城五矿,00000001,8-1水文常观孔,8-1,148.110,442.568,20.63,2021-08-01/06:00:00,~150623B0012000900004,长城五矿,00000002,奥灰水文常观孔,奥灰水,69.220,291.844,19.19,2021-08-01/06:00:00,~150623B0012000900004,长城五矿,00000003,N-1水文常观孔,N-1,73.970,656.894,18.88,2021-07-06/06:00:00,~150623B0012000900004,长城五矿,00000004,N-2水文常观孔,N-2,129.110,684.922,19.63,2021-07-07/06:00:00,~150623B0012000900004,长城五矿,310100000,中央泵房1号排水管道,中央泵房1号管道排水量,0,2021-08-01/23:56:00,,,~150623B0012000900004,长城五矿,310200000,中央泵房2号排水管道,中央泵房2号管道排水量,0,2021-08-01/23:56:00,,,~150623B0012000900004,长城五矿,310300000,800水仓入口,800水仓入口明渠流量,14.931,2021-08-01/23:56:00,,,~150623B0012000900004,长城五矿,310500000,主斜井,主斜井明渠流量,5.143,2021-08-01/23:56:00,,,~150623B0012000900004,长城五矿,310600000,800石门,800石门明渠流量,9.443,2021-08-01/23:56:00,,,~";
String [] temp1=kafkadata.split("~");
System.out.println(temp1.length);
dataList.clear();
for (int i=0;i<temp1.length;i++){
String []temp2=temp1[i].split(",",-1);
if ( temp2[7].length()!=0){
for (int j=0;j<3;j++){
SWDZ swdz=new SWDZ();
swdz.setPk_id(UUID.randomUUID().toString());
swdz.setMinecode(temp2[0]);
swdz.setMinename(temp2[1]);
swdz.setStation_code(temp2[2]);
swdz.setAddress_name(temp2[3]);
swdz.setStation_name(temp2[4]);
swdz.setMonitoring_type_code(CDLXCODE[j]);
swdz.setMonitoring_type(CDLXNAME[j]);
swdz.setJctime(temp2[8].replace("/"," "));
swdz.setJcvalue(temp2[j+5]);
swdz.setJLDW(JLDW[j]);
swdz.setZdflag("0");
dataList.add(swdz);
}
}else {
SWDZ swdz=new SWDZ();
swdz.setPk_id(UUID.randomUUID().toString());
swdz.setMinecode(temp2[0]);
swdz.setMinename(temp2[1]);
swdz.setStation_code(temp2[2]);
swdz.setAddress_name(temp2[3]);
swdz.setStation_name(temp2[4]);
swdz.setMonitoring_type_code(CDLXCODE[3]);
swdz.setMonitoring_type(CDLXNAME[3]);
swdz.setJctime(temp2[6].replace("/"," "));
swdz.setJcvalue(temp2[5]);
swdz.setJLDW(JLDW[3]);
swdz.setZdflag("1");
dataList.add(swdz);
}
}
jsondata = JSON.toJSONString(dataList);
System.out.println(jsondata);
}
}
运行的结果发现多了一个变量:
但是在debug的时候list集合里是不存在这种问题的,
后来反复查看JLDW(期间还更换了jar包的版本,但是问题还在)。发现是因为命名问题, 由setter,getter导致JSON.toJSONString()部分字段出现异常,在java的变量,都是驼峰命名,如:helloWorld,那么它生成的setter,getter方法就是,setHelloWorld(),getHelloWorld()。hWorld这样生成的时候,h不大写,依然小写。 调用JSON.toString(obj)中会将返回值中自动将首字母变小写,在JSON往回查的时候会默认get后一位为大写字母。)。就会出现这种诡异的事情,
我们将代码中的
public String JLDW;
改为
public String jldw;
就解决了这种问题了
所以以后在码代码时,一定要注意命名的规范,可以避免一些不必要的错误。