Java 使用jackson对json编码的坐标数组进行解码和编码
我用java构建了一个服务器,它接受一个json编码的坐标数组,该数组表示为一个包含纬度和经度的数组 看起来是这样的Java 使用jackson对json编码的坐标数组进行解码和编码,java,json,jackson,geospatial,Java,Json,Jackson,Geospatial,我用java构建了一个服务器,它接受一个json编码的坐标数组,该数组表示为一个包含纬度和经度的数组 看起来是这样的 [["48.72028","21.25768"],["48.71669000000001","21.253410000000002"]] 现在我需要把它解码成一个坐标数组。坐标是com.violesolutions.jts.geom.coordina 此数组表示转换为多边形的多段线。多段线有数百个点长。我还需要将json编码的多边形发送回客户端 到目前为止,我一直使用谷歌gso
[["48.72028","21.25768"],["48.71669000000001","21.253410000000002"]]
现在我需要把它解码成一个坐标数组。坐标是com.violesolutions.jts.geom.coordina
此数组表示转换为多边形的多段线。多段线有数百个点长。我还需要将json编码的多边形发送回客户端
到目前为止,我一直使用谷歌gson,但速度很慢。json解码和编码比多边形转换花费更多的时间
在谷歌搜索了一下之后,我觉得杰克逊应该是最快的
但由于我是一名php开发人员,json解码和编码只需一行代码,这是我第一次编写java,所以我不知道如何使用它
如何在坐标[]数组中解码json,然后再次将类似数组编码为json
谢谢如果我能很好地理解你的问题,那是一个数组。我不确定我的方法是否适合您(很抱歉,我这里没有测试环境)。但是,对于对象数组,它可以正常工作:
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) {
}
ObjectMapper mapper=new ObjectMapper();
JavaType type=mapper.getTypeFactory().ConstructionType(ArrayList.class,ArrayList.class);
列出结果;
试一试{
results=(List)mapper.readValue(jsonData,type);
坐标[]坐标=新坐标[results.size()];
对于(int i=0;i
我希望这有助于您只需要在坐标类上添加两个简单的注释:
@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(shape=shape.ARRAY)
@JsonPropertyOrder({“x”,“y”})
公共静态类坐标{
公共双x;
公共双y;
公共坐标(){}
公共坐标(双x,双y){
这个.x=x;
这个。y=y;
}
}
public void test()引发IOException{
列表p=新的ArrayList();
p、 添加(新坐标(1,2));
p、 添加(新坐标(3,4));
ObjectMapper mapper=新的ObjectMapper();
字符串writeValueAsString=mapper.writeValueAsString(p);
System.out.println(writeValueAsString);
CollectionType CollectionType=mapper.getTypeFactory().ConstructionCollectionType(ArrayList.class,Coordinate.class);
List 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确保属性总是按照正确的顺序解码。这有额外的好处,你甚至可以用相同的格式编码你的数据
如果您无法访问坐标类来添加这些注释,只需使用Jackson的mix-in功能即可。对不起,我曾与Jackson合作处理JSON数据,但我从未见过您提供的格式的JSON数据。这是有效的JSON数据吗?它不应该像:“字段”:“值”对吗?它是一个json数组。没什么不寻常的。您描述的是一个对象。如果您给出在Gson中所做的示例,我可以帮助您将其转换为Jacksony。您可以在此处看到代码。谢谢,这是可行的,但在大多数情况下,它实际上比使用Gson慢。这很酷,但我无法从另一个库向类添加注释,可以吗?是的,使用mix-ins:。该特性是专门为该用例设计的;)