Cómo guardar un JSONObject en un archivo json con codificación UTF8 en Rad Studio/Delphi.
Uso Rad Studio 11. Leo información de un archivo json (el archivo está codificado en UTF8) y lo convierto en un objeto json.
Luego hago cambios en este objeto json y quiero guardarlo en un archivo json. La información se escribe correctamente en el archivo, pero el archivo tiene la codificación Windows-1251. ¿Qué se debe hacer para que la codificación del archivo sea UTF8? Esto me es necesario porque el archivo json incluye símbolos rusos (en la codificación Windows-1251 se ven como ‘?’).
Leo desde un archivo de la siguiente manera:
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;
Convierto a JsonObject de la siguiente manera:
LJsonObj := TJSONObject.ParseJSONValue(str1) as TJSONObject;
Intento guardar JsonObject de la siguiente manera:
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- es la ruta del archivo,form1.filename- el nombre del archivo sin la extensión del archivo
listStr.SaveToFile(Form1.filepath+'\' + form1.filename + '.json');
finalmente
listStr.Free;
end;
davy.ai
Para asegurarse de que el archivo guardado tenga codificación UTF8, es necesario utilizar el método SaveToStream de TStringList con un flujo de texto codificado en UTF8. Aquí está el código actualizado que puedes usar para guardar el JsonObject en un archivo codificado en UTF8:
Este código crea un objeto TStringStream inicializado con una cadena vacía y una codificación UTF8. Después de guardar listStr en el flujo, guarda el flujo en el archivo utilizando TFile.WriteAllBytes con la ruta y nombre del archivo. Esto debería asegurar que el archivo guardado tenga codificación UTF8 y que tus símbolos rusos se muestren correctamente.