この質問 から続く。
次のjson配列の逆シリアル化に問題があります(サイズについては申し訳ありません):
"geometry": { "type": "Polygon", "coordinates": [ [ [ 771230.894373, 4422896.962001 ],
[ 804804.852796, 4451159.130080 ], [ 876828.563339, 4417873.954498 ], [ 959794.979827,
4430944.287708 ], [ 910992.515063, 4372980.866944 ], [ 932488.308736, 4357684.778349 ],
[ 918573.372386, 4115663.286966 ], [ 834059.614976, 4013708.358795 ], [ 929360.231044,
3833522.241529 ], [ 1008029.715188, 3776446.653183 ], [ 1061663.445852, 3533717.758754
], [ 1035703.740599, 3519308.069656 ], [ 1095348.723766, 3396028.487184 ], [
1108462.159782, 3230455.268230 ], [ 1083571.121640, 3163122.508021 ], [ 1103953.720405,
3082716.041755 ], [ 1045722.494771, 3020215.642212 ], [ 1117367.719045, 2915275.458735
], [ 1141268.013718, 2827405.304519 ], [ 1286729.192338, 2790314.754276 ], [
1334329.406601, 2695307.513404 ], [ 829417.592210, 2374337.277646 ], [ 647042.870444,
2207530.090128 ], [ 370914.873531, 2152159.656850 ], [ 346669.488436, 2173360.227237 ],
[ 359905.375891, 2251757.174668 ], [ 199905.871774, 2309591.361246 ], [ 129963.835709,
2361036.252651 ], [ 130208.738589, 2404106.913263 ], [ -964785.432600, 3159802.671416
], [ -964829.960396, 3338713.127631 ], [ -851005.781060, 3424742.002477 ], [ -
616522.405653, 3491025.523892 ], [ -547749.224241, 3569019.334331 ], [ -403724.067052,
3628920.873754 ], [ -423973.082428, 3724062.779415 ], [ -333893.350478, 3741450.793542
], [ -317696.364567, 3774909.265404 ], [ -131414.328674, 3777826.527844 ], [ -
112467.751341, 3830221.719769 ], [ -185682.580436, 3930014.456814 ], [ -194499.084106,
4129581.855629 ], [ -245950.952751, 4175549.526399 ], [ -42303.076294, 4287174.981681
], [ -11222.674464, 4271148.905617 ], [ 131633.628071, 4371332.547494 ], [
433220.392528, 4427574.250017 ], [ 593119.709103, 4389089.571176 ], [ 719645.442339,
4451856.882422 ], [ 771230.894373, 4422896.962001 ] ] ] }
それをjson-viewerに貼り付けると、次の構造になります。
[geometry]
...
[coordinates] => Array
(
[0] => Array
(
[0] => Array
(
[0] => 771230.894373
[1] => 4422896.962001
)
[1] => Array
(
[0] => 804804.852796
[1] => 4451159.13008
)
...
[n] => Array
[n] => Array
これで、座標を持つ配列を含む配列のサイズは可変になります。したがって、Javaでは、このオブジェクト全体が配列のコレクションを含む配列であり、各配列にはCollection<double[]>
が含まれていると考えました。 Collection<double[]>[][].
のようなもの
しかし、gsonはこれを受け入れません。次のエラーメッセージが表示されます。
Exception in thread "main" com.google.gson.JsonParseException: Expecting object but
found array: 2.963610
2.963610
は私には配列のようには見えないので、これは奇妙に思えます。しかし、多かれ少なかれ、私が迷子になるまで私を混乱させたかもしれません...
Gson APIを読んで、あなたの問題がどこから来ているのか知っていると思います:
シリアル化/逆シリアル化するオブジェクトがParameterizedTypeである(つまり、少なくとも1つの型パラメーターを含み、配列である可能性がある)場合は、toJson(Object、Type)またはfromJson(String、Type)メソッドを使用する必要があります。 ParameterizedTypeをシリアル化および逆シリアル化する例を次に示します。
Type listType = new TypeToken<LinkedList>() {}.getType();
List target = new LinkedList();
target.add("blah");
Gson gson = new Gson();
String json = gson.toJson(target, listType);
List target2 = gson.fromJson(json, listType);
知っています
Type typeOfCollectionOfFoo = new TypeToken<Collection<Foo>>(){}.getType()
お役に立てれば。
JSONのcoordinates
は3次元の行列です。 Collection<double[]>[][]
あなたは一次元を行き過ぎています。 Collection
自体はすでに1次元であるため、基本的に4次元行列を宣言しました。
エラーメッセージで、Gsonは基本的に、4次元のオブジェクトを予期していることを通知していますが、代わりにdoubleが発生しました。
以下は、Gsonが完全に処理する必要がある有効な3次元行列を表しています。
private double[][][] coordinates;
(推奨)private Collection<double[]>[] coordinates;
private Collection<double[][]> coordinates;
private Collection<Collection<double[]>> coordinates;
private Collection<Collection<Collection<Double>>> coordinates;
そうは言っても、この特定のケースでは、 List
よりも Collection
の方が好きです。 List
を使用すると、挿入順序が満たされていることを保証でき、インデックスごとに get 要素を取得できます。
Gsonユーザーガイドによると:
ジェネリック型のシリアル化と逆シリアル化
toJson(obj)を呼び出すと、Gsonはobj.getClass()
を呼び出して、シリアル化するフィールドに関する情報を取得します。同様に、通常はfromJson(json, MyClass.class)
メソッドで_MyClass.class
_オブジェクトを渡すことができます。オブジェクトが非ジェネリック型である限り、これは正常に機能します。ただし、オブジェクトがジェネリック型の場合、 Java Type Erasure のため、ジェネリック型の情報は失われます。ポイントを説明する例を次に示します。
_List<String> myStrings = new List<String>();
gson.toJson(myStrings); // Will cause a runtime exception
gson.fromJson(json, myStrings.getClass());
_
Gsonがクラス情報を取得するためにmyStrings.getClass()
を呼び出すため、上記の呼び出しは実行時例外になりますが、このメソッドは生のクラス_List.class
_を返します。これは、Gsonには、これが文字列のリストであり、プレーンオブジェクトではないことを知る方法がないことを意味します。
この問題は、ジェネリック型に正しいパラメーター化された型を指定することで解決できます。これは、TypeToken
クラスを使用して行うことができます。
_Type listType = new TypeToken<List<String>>() {}.getType();
gson.toJson(myStrings, listType);
gson.fromJson(json, listType);
_
listType
を取得するために使用されるイディオムは、完全にパラメーター化された型を返すメソッドgetType()
を含む匿名のローカル内部クラスを実際に定義します。
お役に立てれば。
逆シリアル化のために書いたものなど、さらに詳細が必要だと思います。