我在java中构建了一个服务器,它接受一个json编码的坐标数组,表示为包含纬度和经度的数组。
所以它看起来像这样
[["48.72028","21.25768"],["48.71669000000001","21.253410000000002"]]
现在我需要将其解码为Coordinate数组。坐标为com.vividsolutions.jts.geom.Coordinate。
此数组表示变换为多边形的折线。折线长达数百个点。我还需要将json中编码的多边形发送回客户端
直到现在我使用谷歌gson,但它很慢。 json解码和编码比多边形转换花费更多时间。
经过一番谷歌搜索后,我得到了杰克逊应该是最快的印象。但是因为我是一个php开发人员,其中json解码和编码只是一行,这是我第一次编写java,我不知道如何使用它。
如何解码Coordinate []数组中的json,然后再将相似的数组编码为json?
感谢
答案 0 :(得分:1)
您需要的只是Coordinate类上的2个简单注释:
@JsonFormat(shape = Shape.ARRAY)
@JsonPropertyOrder({"x", "y"})
public static class Coordinate {
public double x;
public double y;
public Coordinate() {}
public Coordinate(double x, double y) {
this.x = x;
this.y = y;
}
}
public void test() throws IOException {
List<Coordinate> p = new ArrayList<Coordinate>();
p.add(new Coordinate(1, 2));
p.add(new Coordinate(3, 4));
ObjectMapper mapper = new ObjectMapper();
String writeValueAsString = mapper.writeValueAsString(p);
System.out.println(writeValueAsString);
CollectionType collectionType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Coordinate.class);
List<Coordinate> readValue = mapper.readValue(writeValueAsString, collectionType);
assertEquals(readValue.size(), 2);
assertEquals(readValue.get(0).x, 1, 0.0);
assertEquals(readValue.get(0).y, 2, 0.0);
assertEquals(readValue.get(1).x, 3, 0.0);
assertEquals(readValue.get(1).y, 4, 0.0);
}
没有涉及中间过程,杰克逊为你做了所有的工作。 @JsonFormat注释告诉Jackson你期望的是一个数组而不是一个对象,而@JsonPropertyOrder确保这些属性总是以正确的顺序解码。这有额外的好处,你甚至可以用相同的格式编码你的数据!
如果您无法访问Coordinate类来添加这些注释,只需使用Jackson的混合功能。
答案 1 :(得分:0)
如果我理解你的问题,那就是一系列数组。我不确定我的方法对你有用(对不起,我这里没有测试环境)。但是,它可以很好地处理对象数组:
ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory().constructCollectionType(ArrayList.class, ArrayList.class) ;
List<List> results;
try {
results = (List<List>)mapper.readValue(jsonData, type);
Coordinate[] coordinates = new Coordinate[results.size()];
for (int i = 0; i < list.size(); i++) {
coordinates[i] = new Coordinate(Double.parseDouble((String)results.get(i).get(0)),Double.parseDouble((String)results.get(i).get(1)));
}
} catch (JsonParseException e) {
} catch (JsonMappingException e) {
} catch (IOException e) {
}
我希望这会有所帮助