2017-10-18 72 views
0

我正在寻找一种方法来确保非法字符已被“转义”或任何它从字符串调用之前将字符串添加到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的问题。

+0

请参阅[如何使用delphi替换给定字符串中的特殊字符,使用空格或无空格](https://stackoverflow.com/q/21979184/576719)。 –

+0

哦,哇,我从来没有使用内置于Delphi的JSON工具,我使用超级对象......但是我很震惊地发现,在传递给JSON对象之前,您有责任格式化字符串*。本质上,我习惯于超级对象自动为我做这件事。这是首先使用库来序列化JSON的主要原因之一! –

+1

@Jerry内建库处理逃跑罚款。 –

回答

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来解决这个问题。