Delphi方法在添加到JSON之前从字符串中删除非法字符

时间:2017-10-18 15:53:37

标签: json delphi

我正在寻找一种方法来确保非法字符已被“转义”或者在将字符串添加到JSON对象并发送之前从字符串中调用它。

目的是使用rest和JSON将数据从数据集重新调整到客户端,因为数据集中可能存在非法字符我猜我需要在将结果数据返回给客户端(服务器端)之前处理字符串在客户端,我需要再次解码这些字符串。

我没有在delphi中找到任何“utils”,但肯定它们必须存在?

E.g。非法字符串“ Bygning 9O \ Ventilation \Anlæg07A\ Varmeflade \ Alarm frostsikring ”,其中反斜杠是个问题。

处理此问题的最佳方法是什么?我甚至不知道哪些字符是非法的。

procedure TRestWebModule.AlarmsGet(Request: TWebRequest; Response: TWebResponse);
var
  a: TJSONArray;
  o: TJSONObject;
  includeOOS : Boolean;
  s : string;
begin
  includeOOS := False;
  // Load query parameters.
  if Request.QueryFields.Count > 0 then
    includeOOS := StrToBoolDef(Request.QueryFields.values['includeOOS'], False);

  Ad_fetchalarmhistoryProc.Close;
  Ad_fetchalarmhistoryProc.ParamByName('@includeOOS').Value := includeOOS;
  Ad_fetchalarmhistoryProc.Active := True;

  // Put results in a JSON object...

  if Ad_fetchalarmhistoryProc.Active then begin
    if Ad_fetchalarmhistoryProc.RecordCount > 0 then begin
      a := TJSONArray.Create;
      try
        Ad_fetchalarmhistoryProc.First;
        while (not Ad_fetchalarmhistoryProc.Eof) do
        begin
          o := TJSONObject.Create;
          o.AddPair('EventId',TJSONNumber.Create( Ad_fetchalarmhistoryProc.FieldByName('EventId').AsInteger ));
          o.AddPair('FriendlyName',Ad_fetchalarmhistoryProc.FieldByName('mod_FriendlyName').AsString );
          o.AddPair('SiteName',Ad_fetchalarmhistoryProc.FieldByName('SiteName').AsAnsiString );

          o.AddPair('AlarmReservedByUser',Ad_fetchalarmhistoryProc.FieldByName('AlarmReservedByUser').AsString );
          o.AddPair('AlarmState',Ad_fetchalarmhistoryProc.FieldByName('AlarmState').AsString );
          o.AddPair('WorkflowState',Ad_fetchalarmhistoryProc.FieldByName('WorkflowState').AsString );
          o.AddPair('AlarmCounter',TJSONNumber.Create( Ad_fetchalarmhistoryProc.FieldByName('AlarmCounter').AsInteger ));
          o.AddPair('Priority',TJSONNumber.Create( Ad_fetchalarmhistoryProc.FieldByName('Priority').AsInteger ));

          o.AddPair('TechnicalAddress',Ad_fetchalarmhistoryProc.FieldByName('TechnicalAddress').AsString );
          o.AddPair('AlarmAlias',Ad_fetchalarmhistoryProc.FieldByName('AlarmAlias').AsString );

          // excape chars are a problem
          s := Ad_fetchalarmhistoryProc.FieldByName('AlarmMessage').AsString;
        //  o.AddPair('AlarmMessage', s );

          o.AddPair('EventText',Ad_fetchalarmhistoryProc.FieldByName('EventText').AsString );
          o.AddPair('CallListName',Ad_fetchalarmhistoryProc.FieldByName('CallListName').AsString );

          o.AddPair('EventTime', TJSONNumber.Create( Ad_fetchalarmhistoryProc.FieldByName('EventDateTime').AsFloat ) );

          a.AddElement(o);
          Ad_fetchalarmhistoryProc.Next;
        end;
      finally
        Response.ContentType := 'application/json; charset=utf-8';
        Response.Content := a.ToString;
        a.DisposeOf;
      end;
    end;
  end;
end;

更新

我在调用localhost:8080/alarms

时在firefox中遇到此错误

从a.Tostring更改为a.ToJSON解决了这个问题。

但我不想那样做。它可能会再与其他角色一起发生。

使用浏览器测试响应时似乎只是一个问题,当我使用Delphi REST客户端时,使用JSON没有问题。

1 个答案:

答案 0 :(得分:0)

在解决了这个问题之后,我找到了解决方案。

问题出在最后一节

  finally
    Response.ContentType := 'application/json; charset=utf-8';
    Response.Content := a.ToString; // incorrect
    a.DisposeOf;
  end;

我应该是这样的

  finally
    Response.ContentType := 'application/json; charset=utf-8';
    Response.Content := a.ToJSON; // correct
    a.DisposeOf;
  end;

然后框架将对所有内容进行编码。只是想分享一下,也许其他人会使用Tostring遇到这个问题。