0

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

所以看起来像这样

[["48.72028","21.25768"],["48.71669000000001","21.253410000000002"]]

现在我需要将它解码成一个坐标数组。坐标是 com.vividsolutions.jts.geom.Coordinate。

该数组表示一条折线,该折线转换为多边形。折线有数百个点长。我还需要将 json 编码的多边形发送回客户端

到目前为止,我一直在使用谷歌 gson,但速度很慢。json解码和编码比多边形转换花费更多时间。

经过一番谷歌搜索后,我觉得杰克逊应该是最快的。

但由于我是一名 php 开发人员,其中 json 解码和编码只是一行,这是我第一次编写 java,我不知道如何使用它。

你如何解码 Coordinate[] 数组中的 json,然后将类似的数组再次编码为 json?

谢谢

4

2 回答 2

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 的混合功能。

于 2013-03-25T19:41:53.253 回答
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) {
  }

我希望这有帮助

于 2013-03-24T19:57:04.030 回答