一、json转java实体
json格式的数据转java实体:http://www.bejson.com/json2javapojo/new/
本人是在这个基础上面再次进行实体的封装
源数据如下
[{"obj2": {
"geometry": "POLYGON ((102.609458921 25.0533587, 102.609212857 25.05333837))",
"properties": {
"DLBZ": "",
"EG_N_RID": "",
"OPYEAR": "2016",
}
},
"obj1": {
"geometry": "POLYGON ((102.609302507 25.051982325, 102.60912423 25.052274094, 102.609118412 25.052443891))",
"properties": {
"DLBZ": "",
"EG_N_RID": "",
"OPYEAR": "2016",
}
}
},{
"obj2": {
"geometry": "POLYGON ((102.609458921 25.0533587, 102.609212857 25.05333837))",
"properties": {
"DLBZ": "",
"EG_N_RID": "",
"OPYEAR": "2016",
}
},
"obj1": {
"geometry": "POLYGON ((102.609302507 25.051982325, 102.60912423 25.052274094, 102.609118412 25.052443891))",
"properties": {
"DLBZ": "",
"EG_N_RID": "",
"OPYEAR": "2016",
}
}
}]
这是一个json数组,里面有两个花括号括起来的两个对象,我们可以把外面的数组设置成一个list1,里面的两个对象又是一个list2,list2对应着一个自增的id,每个list2里面又有obj(i)(1<i<n)个对象。每个obj里面有一geometry字符串和Properties实体对象。进行了多层封装后得到
第一步:json转实体
Properties
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 图斑属性的实体
* Created by zhanglu on 2018/9/27.
*/
public @Data
class Properties implements Serializable {
private static final long serialVersionUID = 1L;
@JSONField(name = "DLBZ")
private String DLBZ;
@JSONField(name = "EG_N_RID")
private String EG_N_RID;
@JSONField(name = "OPYEAR")
private String OPYEAR;
}
Obj
import lombok.Data;
import java.io.Serializable;
/**
* 地类图斑的实体
* Created by zhanglu on 2018/9/27.
*/
public @Data
class Obj implements Serializable {
private static final long serialVersionUID = 1L;
private String geometry;
private Properties properties;
}
objArray
import lombok.Data;
import java.util.List;
/**
* Created by zhanglu on 2018/9/27.
*/
public @Data
class ObjArray {
private Integer id;
private List<Obj> objList;
}
第二步:json变实体接收,将json字符串转成java对象,下面org就是上面的json数组加两个引号的字符串。
List<Obj> objList = null;
ObjArray objArray = null;
//List是一个接口,必须由他的实现类来进行实例化,在进行add的时候如果没有实例化就会报空指针
List<ObjArray> objArrays = new ArrayList<>();
JSONArray orgArr = JSONArray.parseArray(org);
// json字符串转java实体
// 获取每一个地块,转为jsonObject
for (int i = 0; i < orgArr.size(); i++) {
String responseString = orgArr.getString(i);
log.info(responseString.toString());
JSONObject response = (JSONObject) JSONObject.parseObject(orgArr.getString(i));
// 获取每一个地块的图斑对象
objList = new ArrayList<Obj>();
for (Map.Entry<String, Object> entry : response.entrySet()) {
Obj obj = (Obj) JSONObject.toJavaObject((JSONObject) entry.getValue(), Obj.class);
log.info(obj.toString());
objList.add(obj);
}
//注意在哪里用到了对象要及时的new对象,不然对象会被覆盖
objArray = new ObjArray();
objArray.setId(i + 1);
objArray.setObjList(objList);
objArrays.add(objArray);
}
// end json字符串转java实体
二、java转json
需求是我要把上面的java实体里面的里面的propertie。s里面的key全部取出来给他,变为一个jsonArray,jsonArray里面的key和value都是properties的key。因为我前端有一个合并单元格的操作,合并的依据就是objArray的id一样的就给它合并为一行。一个obj里面的properties的value值就是前端显示列表的一行数据。我们new一个jsonArray,然后new一个jsonObject,
1.获取前端要展示的列名:弄了一个bool变量,如果添加完第一列数据(列名),就将addColDone设置成true。将list2里面的对象的propties反编译,获取属性值先put进去一个jsonObject然后在put进去一个jsonArray。
2.获取前端要展示的列表数据:接着讲列表除列名外的其他数据,获取到properties对象,先转成jsonString,然后在转成jsonObject,然后在add进去jsonArray。
JSONArray cols = new JSONArray();
JSONArray dataList = new JSONArray();
boolean addColDone = false;
for (ObjArray obja: data) {
int _index=obja.getId();
List<Obj> objs = obja.getObjList();
for (Obj obj: objs) {
if (!addColDone) {
JSONObject columns = new JSONObject();
columns.put("title", "No.");
columns.put("key", "no");
cols.add(columns);
columns = new JSONObject();
columns.put("title", "图斑名称");
columns.put("key", "layerName");
cols.add(columns);
columns = new JSONObject();
columns.put("title", "操作");
columns.put("key", "operation");
cols.add(columns);
Properties props = obj.getProperties();
Field[] fields=props.getClass().getDeclaredFields();
for(int i=0;i<fields.length;i++){
JSONObject col = new JSONObject();
col.put("title", fields[i].getName());
col.put("key", fields[i].getName());
cols.add(col);
}
JSONObject tableProps = JSON.parseObject(JSONObject.toJSONString(props));
tableProps.put("no", _index);
tableProps.put("layerName", "图斑"+_index);
tableProps.put("operation", "点亮图斑"+_index);
tableProps.put("geometry", obj.getGeometry());
dataList.add(tableProps);
addColDone = true;
} else {
Properties props = obj.getProperties();
JSONObject tableProps = JSON.parseObject(JSON.toJSONString(props));
tableProps.put("no", _index);
tableProps.put("layerName", "图斑"+_index);
tableProps.put("operation", "点亮图斑"+_index);
tableProps.put("geometry", obj.getGeometry());
dataList.add(tableProps);