Autor Beitrag
jackie05
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Di 16.01.18 22:34 
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:
ausblenden 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:
ausblenden volle Höhe 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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:
ausblenden 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
ausblenden Delphi-Quelltext
1:
JSONObjectLevelItems.AddPair('tileItems', TileString);					

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

Danke schon mal.

Gruss
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 17.01.18 13:52 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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:
ausblenden 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