Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 2D Tiled Array zu JsonArray?


jackie05 - Di 16.01.18 22:34
Titel: 2D Tiled Array zu JsonArray?
Hallo,
ich versuche irgendwie ein 2D Array in einem JsonArray hinzuzufügen, leider weiss ich nicht genau, wie ich das hinbekommen kann.

So soll das JsonArray z.B. aussehen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
"tileItems" : [ [0,0,0,0,1,0,0,0,0],
    [0,0,0,2,2,0,0,0,0],
    [0,0,0,2,2,2,0,0,0],
    [0,0,2,2,2,2,0,0,0],
    [0,0,2,2,2,2,2,0,0],
    [0,2,2,2,2,2,2,0,0],
    [0,2,2,2,2,2,2,2,0],
    [2,2,2,2,2,2,2,2,0],
    [2,2,2,2,2,2,2,2,2] ]


Hier ist mal mein Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
var
  i, j, x, y: integer;
  JSONArrayTypeItems: TJSONArray;
  JSONObjectTypeItems: TJSONObject;
  JSONArrayLevelItems: TJSONArray;
  JSONObjectLevelItems: TJSONObject;
  JSONArrayTilesItems: TJSONArray;
  JSONObjectTilesItems: TJSONObject;
  JSONObjectResponse: TJSONObject;
begin
  JSONArrayTypeItems := TJSONArray.Create;
  JSONObjectResponse := TJSONObject.Create;

  for i := 0 to High(TypeArray) do begin
    JSONObjectTypeItems := TJSONObject.Create;
    JSONObjectTypeItems.AddPair('title', TypeArray[i].Title);
    JSONObjectTypeItems.AddPair('description', TypeArray[i].Description);

    JSONArrayLevelItems := TJSONArray.Create;
    for j := 0 to High(TypeArray[i].LevelArray) do begin
      JSONObjectLevelItems := TJSONObject.Create;
      JSONObjectLevelItems.AddPair('title', TypeArray[i].LevelArray[j].Title);

      JSONArrayTilesItems := TJSONArray.Create;
      for y := 0 to High(TypeArray[i].LevelArray[j].TileArray) do begin
        JSONObjectTilesItems := TJSONObject.Create;
        for x := 0 to High(TypeArray[i].LevelArray[j].TileArray) do begin
          //TypeArray[i].LevelArray[j].TileArray[x][y].TileNr
        end;
        JSONArrayTilesItems.Add(JSONObjectTilesItems);
      end;
      JSONObjectLevelItems.AddPair('tileItems', JSONArrayTilesItems);
      JSONArrayLevelItems.Add(JSONObjectLevelItems);
    end;
    JSONObjectTypeItems.AddPair('levelItems', JSONArrayLevelItems);
    JSONArrayTypeItems.Add(JSONObjectTypeItems);
  end;

  JSONObjectResponse.AddPair('typeItems', JSONArrayTypeItems);
  Memo1.Text := JSONObjectResponse.ToJSON;


Ich weiss jetzt nicht, wie ich das in der for schleife bei x und y die JsonArrays so erstelle, das diese dann so hinzugefügt werden:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
"tileItems" : [ [0,0,0,0,1,0,0,0,0],
    [0,0,0,2,2,0,0,0,0],
    [0,0,0,2,2,2,0,0,0],
    [0,0,2,2,2,2,0,0,0],
    [0,0,2,2,2,2,2,0,0],
    [0,2,2,2,2,2,2,0,0],
    [0,2,2,2,2,2,2,2,0],
    [2,2,2,2,2,2,2,2,0],
    [2,2,2,2,2,2,2,2,2] ]


Kann mir da Vielleicht jemand Weiterhelfen?

Ich bedanke mich schon mal im Voraus.

Gruss

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Symbroson - Mi 17.01.18 10:39

Für was brauchst du denn das JSON Objekt? Möchtest du mit diesem Objekt weiterarbeiten, oder brauchst du es nur zum speichern in eine Datei? Im letzterem Falle würde ich diesen String einfach selber generieren.


jackie05 - Mi 17.01.18 13:02

Danke erst mal für die Antwort.

Ich habe mir ein Spiel in Unity geschrieben und in Delphi habe ich dafür ein Level-Editor für mein Spiel erstellt um schneller Levels zu erstellen.
Beim Laden der Json Datei, kann ich so z.B.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
jsonArrayTileItems := TJSONArray(jsonObjectLevelItem.Get('tileItems').JsonValue);
SetLength(TypeArray[i].LevelArray[j].TileArray, jsonArrayTileItems.Count, jsonArrayTileItems.Count);
for y := 0 to pred(jsonArrayTileItems.Count) do begin
  jsonObjectTileItem := TJSONObject(jsonArrayTileItems.Items[y]);
  jsonArrayTileItems2 := TJSONObject.ParseJSONValue(((jsonArrayTileItems as TJSONArray).Items[y] as TJSONValue).ToJSON) as TJSONArray;

  for x := 0 to pred(jsonArrayTileItems2.Count) do begin
    TypeArray[i].LevelArray[j].TileArray[x][y].TileNr := StrToInt(jsonArrayTileItems2.Items[x].Value);
  end;
end;


dieses Array hier laden:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
"tileItems" : [ [0,0,0,0,1,0,0,0,0],
    [0,0,0,2,2,0,0,0,0],
    [0,0,0,2,2,2,0,0,0],
    [0,0,2,2,2,2,0,0,0],
    [0,0,2,2,2,2,2,0,0],
    [0,2,2,2,2,2,2,0,0],
    [0,2,2,2,2,2,2,2,0],
    [2,2,2,2,2,2,2,2,0],
    [2,2,2,2,2,2,2,2,2] ]


user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Für was brauchst du denn das JSON Objekt? Möchtest du mit diesem Objekt weiterarbeiten, oder brauchst du es nur zum speichern in eine Datei? Im letzterem Falle würde ich diesen String einfach selber generieren.


Ja, hier möchte ich diesen Array jetzt gerne so in einer JSON Datei speichern.
Ich werde es mal versuchen, diesen Array so in einem String zu generieren und diese dann in dem JSON Object mit hinzuzufügen.

Vielen Dank für die Hilfe.

Edit: Ich hab diesen Array jetzt so in einem String generiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
TileString := '[';
      for y := 0 to High(TypeArray[i].LevelArray[j].TileArray) do begin
        TileString := TileString + '[';
        for x := 0 to High(TypeArray[i].LevelArray[j].TileArray) do begin
          TileString := TileString + IntToStr(TypeArray[i].LevelArray[j].TileArray[x][y].TileNr);
          if x < High(TypeArray[i].LevelArray[j].TileArray) then TileString := TileString + ',';
        end;
        TileString := TileString + ']';
        if y < High(TypeArray[i].LevelArray[j].TileArray) then TileString := TileString + ',';
      end;
      TileString := TileString + ']';
      JSONObjectLevelItems.AddPair('tileItems', TileString);

Nur wie kann ich diesen String jetzt im JSON Object ohne Anführungszeichen anhängen?
Mit

Delphi-Quelltext
1:
JSONObjectLevelItems.AddPair('tileItems', TileString);                    

wird mir dieser Array als String in JSON Object angehängt.

Danke schon mal.

Gruss


Delete - Mi 17.01.18 13:52

- Nachträglich durch die Entwickler-Ecke gelöscht -


jackie05 - Mi 17.01.18 14:33

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Entweder mit der Funktion Delete() an der jeweiligen Position die Anführungszeichen entfernen, oder mit der Funktion StringReplace() die Anführungszeichen auf einmal durch einen leeren String ersetzen.
Die neueren Delphiversionen haben stringVariable.Replace() schon intus.

Ja, das wäre auch eine Möglichkeit, bevor ich die Datei entgültig speicher, nach den Zeichen zu suchen und durch einen leeren String zu ersetzen.

Edit: Ich hab die String so ersetzt:

Delphi-Quelltext
1:
2:
response := StringReplace(response, '"[''[', [rfReplaceAll, rfIgnoreCase]);
response := StringReplace(response, ']"'']', [rfReplaceAll, rfIgnoreCase]);


Würde ich nur nach Anführungszeichen suchen, dann würden noch andere Teile ersetzt werden.

Vielen Dank für die Hilfe, es funktioniert alles wie es soll.

Gruss