私は取り組んでいる小さなアンドロイド ゲームのローダー/セーバーを書いています。ゲーム内の「アクター」ごとに json オブジェクトを作成し、それらを jsonarray に入れてjsonarray.tojsonstring()
からファイルに書き込むことで、それを json ファイルとして保存しています。
これが私が保存している方法です。各アクターを配列に追加する保存レベル メソッドを呼び出してから、メソッドaddActor()
を呼び出します。writefile()
public void addActor(Actor actor, int index, JSONArray actorArray) {
if (actor != null) {
System.out.println("adding actor " + actor.name);
} else {
System.out.println("Adding nulla ctor");
}
if (actors[index] != null) {
} else {
actors[index] = new JSONObject();
actors[index].put("index", index);
actors[index].put("bodyname", actor.name);
actors[index].put("restitution", actor.body.getFixtureList().get(0).getRestitution());
actors[index].put("density", actor.body.getFixtureList().get(0).getDensity());
actors[index].put("friction", actor.body.getFixtureList().get(0).getFriction());
actors[index].put("startx", actor.startX);
actors[index].put("starty", actor.startY);
actors[index].put("startrotation", actor.startAngle);
actors[index].put("rotationspeed", actor.rotSpeed);
actors[index].put("enabled", actor.enabled);
actors[index].put("numPaths", actor.numPaths);
if (actor.numPaths > 0) {
JSONArray[] pathx = new JSONArray[actor.getNumPaths()];
JSONArray[] pathy = new JSONArray[actor.getNumPaths()];
JSONArray[] pathspeed = new JSONArray[actor.getNumPaths()];
for (int i = 0; i < actor.getNumPaths(); i++) {
pathx[i] = new JSONArray();
pathy[i] = new JSONArray();
pathspeed[i] = new JSONArray();
for (int j = 0; j < actor.getPath(i).size; j++) {
pathx[i].add(actor.getPath(i).points[j].x);
pathy[i].add(actor.getPath(i).points[j].y);
pathspeed[i].add(actor.getPath(i).points[j].speed);
}
}
System.out.println("added " + actor.name + ", " + pathx.length + " paths.");
actors[index].put("pathx", pathx);
actors[index].put("pathy", pathy);
actors[index].put("pathspeed", pathspeed);
}
//indices.add(index);
actorArray.add(actors[index]);
}
}
public void writeFile(String name, JSONArray actorArray) {
try {
FileWriter writer = new FileWriter("C:\\Users\\mojo\\Desktop\\svn\\Ball\\src\\com\\moe\\ball\\levels\\" + name + ".json");
writer.write(actorArray.toJSONString());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void saveLevel(String levelName, BallScreen screen) {
JSONArray actorArray = new JSONArray();
for (int i = 0; i < screen.maxActor; i++) {
addActor(screen.actorList[i], i, actorArray);
}
writeFile(levelName, actorArray);
}
申し訳ありませんが、私がjsonライブラリを理解し、物事を理解しようとしていたときから、ランダムなものがたくさんあります。読み込みが正しいかどうかをテストするために使用するコードのスニペットをここに示します
JSONArray array = (JSONArray) parser.parse(new FileReader("C:\\Users\\mojo\\Desktop\\svn\\Ball\\src\\com\\moe\\ball\\levels\\" + name + ".json"));
JSONObject obj;
for (int i = 0; i < array.size(); i++) {
obj = (JSONObject) array.get(i);
System.out.println("bodyname " + i + ": " + obj.get("bodyname"));
}
複数の movepaths を持つアクター (したがって、アクターのメイン配列の要素の 1 つ内に配列がある) を持つレベルをロードすると、次の
JSONArray array = ....
行にエラーが表示されます。
Unexpected character (L) at position 50.
json ファイルの小さなスニペットをここに示しますので、問題を引き起こしている場所がどのように見えるかを確認できます
[{"enabled":true,"index":0,"density":0.6,"pathy":[Lorg.json.simple.JSONArray;@39d3da65,"friction":0.6,"rotationspe
the \`L\` in \`[Lorg.json....\` is at position 50.
これが愚かな質問である場合は申し訳ありませんが、私はこれに非常に慣れていません。検索に何時間も費やしました。ここで答えが見つからない場合は、別のjsonライブラリを試してみます(現在json.simpleを使用しています)