使用jackson解码和编码json编码的坐标数组

时间:2013-03-24 16:17:31

标签: java json jackson geospatial

我在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?

感谢

2 个答案:

答案 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) {
  }

我希望这会有所帮助