Java 使用jackson对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

我用java构建了一个服务器,它接受一个json编码的坐标数组,该数组表示为一个包含纬度和经度的数组

看起来是这样的

[["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:。该特性是专门为该用例设计的;)