无法用TJSONObject.Parse解析中文characeters

时间:2013-09-10 07:26:12

标签: json delphi

我收到了以下代码:

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

我的问题是如何解析中文字符而不是???符号。 我缺少一些设置吗?

1 个答案:

答案 0 :(得分:3)

很明显,因为您使用的是TEncoding.ASCII.GetBytes。您应该使用TEncoding.UTF8.GetBytes

您还可以使用直接接受字符串的TJSONObject.ParseJSONValue重载。