我收到了以下代码:
procedure TForm2.Button1Click(Sender: TObject);
Const
StrJson=
'{'+
' "products": {'+
' "Men''s Sneakers": {'+
' "instock": false,'+
' "size": "423",'+
' "manufacturer": "阿迪达斯",'+
' "lastcheck": "20120529"'+
' },'+
' "Purse": {'+
' "instock": true,'+
' "size": "not applicable",'+
' "manufacturer": "普拉达",'+
' "lastcheck": "20120528"'+
' },'+
' "Men''s Hood": {'+
' "instock": false,'+
' "size": "M",'+
' "manufacturer": "通用",'+
' "lastcheck": "20120529"'+
' }'+
' },'+
' "total": 41,'+
' "available": 30'+
'}';
var
LJsonObj : TJSONObject;
LJPair : TJSONPair;
LProducts : TJSONValue;
LProduct : TJSONValue;
LItem : TJSONValue;
LIndex : Integer;
LSize : Integer;
begin
LJsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StrJson),0) as TJSONObject;
try
LProducts := LJsonObj.Get('products').JsonValue;
LSize := TJSONArray(LProducts).Size;
for LIndex:=0 to LSize-1 do
begin
LProduct := TJSONArray(LProducts).Get(LIndex);
LJPair := TJSONPair(LProduct);
memo1.lines.add(Format('Product Name %s',[LJPair.JsonString.Value]));
for LItem in TJSONArray(LJPair.JsonValue) do
begin
if TJSONPair(LItem).JsonValue is TJSONFalse then
memo1.lines.add(Format(' %s : %s',[TJSONPair(LItem).JsonString.Value, 'false']))
else
if TJSONPair(LItem).JsonValue is TJSONTrue then
memo1.lines.add(Format(' %s : %s',[TJSONPair(LItem).JsonString.Value, 'true']))
else
memo1.lines.add(Format(' %s : %s',[TJSONPair(LItem).JsonString.Value, TJSONPair(LItem).JsonValue.Value]));
end;
end;
finally
LJsonObj.Free;
end;
end;
Product Name Men's Sneakers instock : false size : 423 manufacturer : ???? lastcheck : 20120529 Product Name Purse instock : true size : not applicable manufacturer : ??? lastcheck : 20120528 Product Name Men's Hood instock : false size : M manufacturer : ?? lastcheck : 20120529
我的问题是如何解析中文字符而不是???符号。 我缺少一些设置吗?
答案 0 :(得分:3)
很明显,因为您使用的是TEncoding.ASCII.GetBytes
。您应该使用TEncoding.UTF8.GetBytes
。
您还可以使用直接接受字符串的TJSONObject.ParseJSONValue
重载。