拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在UTF8编码RadStudio/Delphi中将JSONObject保存到json档案

如何在UTF8编码RadStudio/Delphi中将JSONObject保存到json档案

白鹭 - 2022-01-23 1948 0 0

我使用 Rad studio 11。我从 json 档案(档案为 UTF8 编码)中读取信息并转换为 jsonobject。然后我对此 jsonobject 进行更改并希望保存到 json 档案。信息已成功写入档案,但档案具有 Windows-1251 编码。需要做什么才能使档案编码为UTF8?它需要我,因为 json 档案包含俄语符号(在 Windows-1251 编码中它看起来像“?”)。

我从这样的档案中读取:

var inputfile:TextFile;
str:string;
...
if OpenDialog1.Execute then  begin
  AssignFile(inputfile, OpenDialog1.FileName);
  reset(inputfile);

  while not Eof(inputfile) do
  begin
    ReadLn(inputfile, str);
    str1 := str1 UTF8ToANSI(str);
  end;

  closefile(inputfile);
end;

我像这样转换为 Jsonobject:

LJsonObj:=TJSONObject.ParseJSONValue(str1) as TJSONobject;

尝试像这样保存 JsonObject:

var   
  listStr: TStringList;
  Size: Integer;
  I: Integer;
  
...
  
  Size := Form3.LJsonObj.Count;
  liststr := TStringList.Create;

  try
    listStr.Add('{');

    if Size > 0 then
      listStr.Add(LJsonObj.Get(0).ToString);
   
    showmessage(LJsonObj.Get(0).ToString);

    for I := 1 to Size - 1 do
    begin
      listStr.Add(',');
      listStr.Add(ANSITOUTF8(LJsonObj.Get(I).ToString));
    end;

    listStr.Add('}');
    // Form1.filepath-is path of file,form1.filename-name of file without file extension 
    listStr.SaveToFile(Form1.filepath '\' form1.filename '.json');
  finally
    listStr.Free;
  end;

uj5u.com热心网友回复:

为什么要使用旧式 Pascal 档案 I/O 读取档案?为什么要在 UTF-8 和ANSI之间转换您使用的是 Unicode 版本的 Delphi,您根本不应该处理 ANSI。

任何状况之下:

  • 读取档案时,请考虑使用TStringList.LoadFromFile()orTFile.ReadAllText()代替。两者都允许您指定 UTF-8 作为源编码。

  • 写入档案时,请考虑使用TStringList.SaveToFile()orTFile.WriteAllText()代替。两者都允许您将 UTF-8 指定为目标编码。

例如:

var
  inputfile: TStringList;
  str1: string;
  ...
begin
  ...
  inputfile := TStringList.Create;
  try
    inputfile.LoadFromFile(OpenDialog1.FileName, TEncoding.UTF8);
    str1 := inputfile.Text;
  finally
    inputfile.Free;
  end;
  ...
end;

...

var   
  listStr: TStringList;
  ...
begin
  ...
  listStr.SaveToFile(Form1.filepath   '\'   form1.filename   '.json', TEncoding.UTF8);
  ...
end;
var
  str1: string;
  ...
begin
  ...
  str1 := TFile.ReadAllText(OpenDialog1.FileName, TEncoding.UTF8);
  ...
end;

...

var
  listStr: TStringList;
  ...
begin
  ...
  TFile.WriteAllText(listStr.Text, TEncoding.UTF8);
  ...
end;

请注意,您实际上并不需要使用 aTStringList来手动构建 JSON 语法。 TJSONObjectToString()ToJSON()方法来为你处理。但是,如果您真的想手动构建自己的 JSON 语法,请考虑使用TJSONObjectBuilderorTJsonTextWriter代替。

uj5u.com热心网友回复:

无需遍历 JSONObject。只需使用:

TFile.WriteAllBytes(Form1.filepath '\' form1.filename '.json',TEncoding.UTF8.GetBytes(LJsonObj.ToJSON))
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *