如何以 UTF8 编码 Rad Studio/Delphi 将 JSONObject 保存到 json 文件
How to save JSONObject to json file in UTF8 encoding Rad Studio/Delphi
我使用 Rad studio 11。我从 json 文件(文件采用 UTF8 编码)读取信息并转换为 json 对象。
然后我对此 json 对象进行了更改并希望保存到 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;
不需要遍历 JSONObject。只需使用:
TFile.WriteAllBytes(Form1.filepath+'\'+form1.filename+'.json',TEncoding.UTF8.GetBytes(LJsonObj.ToJSON))
为什么要使用旧式 Pascal 文件读取文件 I/O?为什么要在 UTF-8 和 ANSI 之间转换?您正在使用 Delphi 的 Unicode 版本,您根本不应该处理 ANSI。
无论如何:
读取文件时,考虑使用TStringList.LoadFromFile()
或TFile.ReadAllText()
代替。两者都允许您将 UTF-8 指定为源编码。
写入文件时,考虑使用TStringList.SaveToFile()
或TFile.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;
请注意,您实际上并不需要使用 TStringList
手动构建 JSON 语法。 TJSONObject
有 ToString()
和 ToJSON()
方法来为您处理。但是,如果您真的想手动构建自己的 JSON 语法,请考虑为此目的使用 TJSONObjectBuilder
或 TJsonTextWriter
。
我使用 Rad studio 11。我从 json 文件(文件采用 UTF8 编码)读取信息并转换为 json 对象。 然后我对此 json 对象进行了更改并希望保存到 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;
不需要遍历 JSONObject。只需使用:
TFile.WriteAllBytes(Form1.filepath+'\'+form1.filename+'.json',TEncoding.UTF8.GetBytes(LJsonObj.ToJSON))
为什么要使用旧式 Pascal 文件读取文件 I/O?为什么要在 UTF-8 和 ANSI 之间转换?您正在使用 Delphi 的 Unicode 版本,您根本不应该处理 ANSI。
无论如何:
读取文件时,考虑使用
TStringList.LoadFromFile()
或TFile.ReadAllText()
代替。两者都允许您将 UTF-8 指定为源编码。写入文件时,考虑使用
TStringList.SaveToFile()
或TFile.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;
请注意,您实际上并不需要使用 TStringList
手动构建 JSON 语法。 TJSONObject
有 ToString()
和 ToJSON()
方法来为您处理。但是,如果您真的想手动构建自己的 JSON 语法,请考虑为此目的使用 TJSONObjectBuilder
或 TJsonTextWriter
。