最近在做空间数据方面的工作,想要定制Geometry数据的JSON格式,从这学到一招JSON过滤属性,设置属性转换器的方法。
bean
package test;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import com.vividsolutions.jts.geom.Point;
public class Bridge {
private String id;
@JsonIgnore
private String qlmc;
@JsonSerialize(using = GeometryJSONFormater.class)
private Point point;
//此处省略了get/set方法
}
属性转换器
package test;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import com.vividsolutions.jts.geom.Geometry;
public class GeometryJSONFormater extends JsonSerializer<Geometry>{
@Override
public void serialize(Geometry value, JsonGenerator jgen,SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeString(value.toString());
}
}
测试类
package test;
import org.codehaus.jackson.map.ObjectMapper;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
public class Test {
public static void main(String[] args) throws Exception{
Bridge o = new Bridge();
o.setId("id");
o.setQlmc("金门大桥");
o.setPoint(createPoint(116,40));
ObjectMapper mapper = new ObjectMapper();
String jsonstr = mapper.writeValueAsString(o);
System.out.println(jsonstr);
//打印结果{"id":"id","point":"POINT (116 40)"}
}
static Point createPoint(double longitude, double latitude){
GeometryFactory geometryFactory = new GeometryFactory();
Coordinate coord = new Coordinate(longitude, latitude);
Point point = geometryFactory.createPoint( coord );
return point;
}
}
JSON有一些标注用于不同用途,比如刚才用到的@JsonIgnore,表示忽略此属性,其他的用到时再查吧。
注意Jackson用于处理Geometry数据时,版本太低可能会报异常(比如Jackson1.8.0版本),请用最新版本的Jackson。