0

緯度と経度を含む配列として表される、jsonでエンコードされた座標の配列を受け入れるJavaでサーバーを構築しました。

こんな感じです

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

今、私はそれを座標の配列にデコードする必要があります。座標はcom.vividsolutions.jts.geom.Coordinateです。

この配列は、ポリゴンに変換されるポリラインを表します。ポリラインの長さは数百ポイントです。また、jsonでエンコードされたポリゴンをクライアントに送り返す必要があります

今まで私はグーグルgsonを使用しましたが、それは遅いです。jsonのデコードとエンコードには、ポリゴン変換よりも時間がかかります。

少しグーグルした後、私はジャクソンが最速であるべきだという印象を受けました。

しかし、私はphp開発者であり、jsonのデコードとエンコードは1行であり、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 に答える