1

JSON スーパーオブジェクト ライブラリを使用して、オブジェクトをファイルに保存しています。私のコードが機能したとき、それらは適切なフォーマットで書かれていました。

procedure TDCell.Save(fileName: string);
var i,j : integer;
    JsonObjCol1, JsonObjCol2, JsonObjCol3, JsonObjCol4: ISuperObject;
begin
  JsonArray := SO();
  JsonObjCol1 := SO();
  JsonObjCol2 := SO();
  JsonObjCol3 := SO();
  JsonObjCol4 := SO();
  for i := 0 to Table.ColCount - 1 do
  begin
    for j := 0 to Table.RowCount - 1 do
begin
  if Table.Objects[i, j] is TEdit then
    with Table.Objects[i, j] as TEdit do
      case i of
        0:JsonArray[Name] := SO(Table.Cells[i, j]);
        1:JsonObjCol1[Name] := SO(Table.Cells[i, j]);
        2:JsonObjCol2[Name] := SO(Table.Cells[i, j]);
        3:JsonObjCol3[Name] := SO(Table.Cells[i, j]);
        4:JsonObjCol4[Name] := SO(Table.Cells[i, j]);
      end
  else
  if Table.Objects[i, j] is TLabel then
    with Table.Objects[i, j] as TLabel do
      case i of
        0:JsonArray[Name] := SO(Caption);
        1:JsonObjCol1[Name] := SO(Caption);
        2:JsonObjCol2[Name] := SO(Caption);
        3:JsonObjCol3[Name] := SO(Caption);
        4:JsonObjCol4[Name] := SO(Caption);
      end
end;
case i of
  0:JsonObject['Col' + IntToStr(Table.ColCount - 1 - i)] := JsonArray;
  1:JsonObject['Col' + IntToStr(Table.ColCount - 1 - i)] := JsonObjCol1;
  2:JsonObject['Col' + IntToStr(Table.ColCount - 1 - i)] := JsonObjCol2;
  3:JsonObject['Col' + IntToStr(Table.ColCount - 1 - i)] := JsonObjCol3;
  4:JsonObject['Col' + IntToStr(Table.ColCount - 1 - i)] := JsonObjCol4;
end;
  end;
  JsonObject.SaveTo(fileName, true);
end;

JsonArrayタイプもありますISuperObject

しかし、このライブラリでは逆順ソート機能が実行されているようです。オブジェクトだけでなく、その中のキーと値のペアも逆のアルファベット順に書かれています。

{
 "Col4": {
  "Label03": "Hello03",
  "Label01": "Hello01",
  "Edit04": "Hello04",
  "Edit02": "Hello02",
  "Edit00": "Hello00"
 },
 "Col3": {
  "Label13": "Hello13",
  "Label11": "Hello11",
  "Edit14": "Hello14",
  "Edit12": "Hello12",
  "Edit10": "Hello10"
 },
 "Col2": {
  "Label23": "Hello23",
  "Label21": "Hello21",
  "Edit24": "Hello24",
  "Edit22": "Hello22",
  "Edit20": "Hello20"
 },
 "Col1": {
  "Label33": "Hello33",
  "Label31": "Hello31",
  "Edit34": "Hello34",
  "Edit32": "Hello32",
  "Edit30": "Hello30"
 },
 "Col0": {
  "Label43": "Hello43",
  "Label41": "Hello41",
  "Edit44": "Hello44",
  "Edit42": "Hello42",
  "Edit40": "Hello40"
 }
}

スーパーオブジェクトに適切な順序でファイルを書き込むにはどうすればよいですか? オブジェクトがサイクルで適切な順序で追加されることをテストしました。ファイルは次のようになっている必要があります。

{
 "Col0": {
  "Edit00": "Hello00",
  "Label01": "Hello01",
  "Edit02": "Hello02",
  "Label03": "Hello03",
  "Edit04": "Hello04"
 },
 "Col1": {
  "Edit10": "Hello10",
  "Label11": "Hello11",
  "Edit12": "Hello12",      
  "Label13": "Hello13",    
  "Edit14": "Hello14"
 },
 and so on
4

1 に答える 1

0

適切な順序はありません。JSON オブジェクトの要素は任意の順序で表すことができ、JSON 標準では、ファイルの意味が JSON オブジェクトの要素の順序に依存できないことが明確になっています。

オブジェクトは、名前と値のペアの順序付けられていないセットです。

順序付けされたデータが必要な場合は、JSON 配列を使用する必要があります。

配列は、順序付けられた値のコレクションです。

于 2015-04-08T17:11:11.013 に答える