我收到POST请求时收到的JSON字符串有问题。目前这是我阅读它的方式:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button" id="sendRequest1" ><span>Avialable Now</span></button>
<button type="button" id="sendRequest2" ><span>Avialable Now</span></button>
我单独尝试procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
Stream : TStream;
S : string;
begin
If ARequestInfo.Command = 'POST' then
begin
Stream := ARequestInfo.PostStream;
if assigned(Stream) then
begin
Stream.Position := 0;
S := UTF8ToAnsi(ReadStringFromStream(Stream));
end;
end;
end;
并ReadStringFromStream()
和UTF8ToAnsi()
,但我一直看到这样的字符串:
&#39; [&#39;#$ A#9&#39; {&#39;#$ A#9#9&#39;&#34;测试&#34;:&#34; BB&# 34;,&#39;#$ A#9#9&#39;&#34;测试&#34;:&#34; AA&#34;&#39;#$ A#9&#39;}&#39 ;#$ A&#39;]&#39;
我知道它与编码有关,但我不知道如何修复它。
答案 0 :(得分:4)
你知道哈希(#)符号表示一个字符值,并且美元($)符号表示十六进制值,是吗?因此#$A
表示字符十进制10,恰好表示NewLine
,而#9
表示字符9,即TAB
字符。返回字符串中没有任何意外。如果您将其提供给理解NewLine
而没有前面的CarriageReturn
的内容,它可能会按预期显示。
exmple的调试器使用#-syntax表示无法以视觉方式表示的字符。
答案 1 :(得分:2)
您在示例中显示的数据完全正常,正如Tom B所解释的那样。您正在查看调试器中的字符串数据,其中#A
是换行符,#9
是制表符字符,所以实际字符串如下所示:
[ { "test":"bb", "test":"aa" } ]
哪个是有效的JSON。
但是,您阅读数据的方式并不正确,尤其是如果您使用的是Unicode版本的Delphi(2009+)。您没有将任何值传递给AByteEncoding
的{{1}}参数,因此它将使用Indy的默认编码对流字节进行解码,默认情况下为7位US-ASCII(请参阅{{ 1}} ReadStringFromString()
单位中的变量。 JSON默认使用UTF-8,因此如果JSON包含任何非ASCII字符,则会损坏JSON。在事实不能解决之后使用GIdDefaultTextEncoding
。
您的代码应该是这样的:
IdGlobal
告诉Indy将流字节解码为UTF-8到UTF-16,然后返回解码后的字符串(如果您使用的是非Unicode版本的Delphi,UTF-16数据将在退出时转换为ANSI ,取决于UTF8ToAnsi()
的可选procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
Stream : TStream;
S : string;
begin
If ARequestInfo.CommandType = hcPOST then
begin
Stream := ARequestInfo.PostStream;
if Assigned(Stream) then
begin
S := ReadStringFromStream(Stream, -1, IndyTextEncoding_UTF8);
end
end
end;
参数。