Перейти к содержанию
Fire Monkey от А до Я
  • 0

JSON Pretty Print - красивый JSON


Евгений Корепов

Вопрос

Долго мучался отсутствием штатного средства красивого вывода JSON в текст, все что есть в комплекте, в REST к примеру, выводит убогую, не читаемую кашу. Плюнул и на написал свою функцию, на базе REST TSON.Format.

function JsonPrettyPrint(AJsonValue : TJsonValue; AIndent : string = '  ') : string;
var SourceContent: string;
    AChar: char;
    EOL: string;
    LeftIndent: string;
    isEOL: boolean;
    isInString: boolean;
    isInArray: boolean;
    isEscape: boolean;
begin
  Result:='';
  EOL:=#13#10;
  AIndent:= '  ';
  LeftIndent:='';
  isEOL:=true;
  isInString:=false;
  isInArray:=false;
  isEscape:=false;
  SourceContent := AJsonValue.ToString; //This will basically display all strings as Delphi strings. Technically we should show "Json encoded" strings here.
  for AChar in SourceContent do
  begin
    case AChar of
      '{' :
        if not isInString and not isInArray then
        begin
          Result := Result + AChar + EOL;
          LeftIndent := LeftIndent + AIndent;
          Result := Result + LeftIndent;
          isEOL := true;
        end;
      ',' :
        if not isInString and (AChar = ',') then
        begin
          isEOL := false;
          if isInArray then
            Result := Result + AChar + ' '
          else
            Result := Result + AChar + EOL + LeftIndent;
        end;
      '}' :
        if not isInString then
        begin
          Delete(LeftIndent, 1, Length(AIndent));
          if not isEOL then
            Result := Result + EOL;
          Result := Result + LeftIndent + AChar;
        end;
      ':' :
        if not isInString and (AChar = ':') then
          Result := Result + AChar + ' ';
       else
        begin
          isEOL := false;
          Result := Result + AChar;
        end;
    end;
    isEscape := (AChar = '\') and not isEscape;
    if not isEscape and (AChar = '"') then
      isInString := not isInString;
    if not isEscape and (AChar = '[') then
      isInArray:=True;
    if not isEscape and (AChar = ']') then
      isInArray:=False;
  end;
end;

Результат налицо:

{
  "Rig": {
    "Name": "node07",
    "Account": "3DQ9fRMVfxHaT7noy7molmuhlCI3RQkxt2y8BB",
    "PowerCost": [4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43]
  },
  "ExcavatorInstance": {
    "Host": "192.168.0.156",
    "Port": 38080,
    "APIToken": "asevsdrbdrtnetyjer34yb435t",
    "ConnectionType": "HTTP"
  },
  "Devices": {
    "DeviceType": "",
    "UseDevices": [0, 1, 2, 3, 4]
  },
  "Algorithms": {
    "cryptonight": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [32, "M=2", 876],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "lbry": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [95, 120, -1000],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "pascal": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "decred": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "neoscrypt": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "daggerhashimoto": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "daggerhashimoto_decred": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "daggerhashimoto_sia": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "lyra2rev2": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [95, 120, -1000],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "blake2s": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "equihash": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": ["2", "M=1", "676556"],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "daggerhashimoto_pascal": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "keccak": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    },
    "sia": {
      "Enable": true,
      "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500],
      "WorkerPerDevice": 1,
      "WorkerParameters": [],
      "Speed": 1506138068.81243,
      "Power": 851
    }
  }
}

Конкретно в текущем случае, массивы мне нужны были в одну строку. Кому понадобиться иное - закомментируйте последние 4 строки.

Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...