我正在寻找一种方法来确保非法字符已被“转义”或任何它从字符串调用之前将字符串添加到JSON对象并发送它。德尔菲法从字符串中删除非法字符,然后添加到JSON
其目的是使用rest和JSON将数据从数据集重新复制到客户端,因为数据集中可能存在非法字符我想我需要在将结果数据返回给客户端之前处理字符串(服务器端),在客户端,我需要再次解码这些字符串。
我没有在delphi中找到任何“utils”,但它肯定存在?
E.g.非法字符串“建立9O \通风\安全07A \ Varmeflade \警报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
当从a.Tostring到a.ToJSON解决它改变了在Firefox这个错误。
但我宁愿不必这样做。它可能会与其他角色再次发生。
当使用浏览器测试响应时,它似乎只是一个问题,当我使用Delphi REST客户端时,没有消耗JSON的问题。
请参阅[如何使用delphi替换给定字符串中的特殊字符,使用空格或无空格](https://stackoverflow.com/q/21979184/576719)。 –
哦,哇,我从来没有使用内置于Delphi的JSON工具,我使用超级对象......但是我很震惊地发现,在传递给JSON对象之前,您有责任格式化字符串*。本质上,我习惯于超级对象自动为我做这件事。这是首先使用库来序列化JSON的主要原因之一! –
@Jerry内建库处理逃跑罚款。 –