Rob*_*Rob 3 delphi json system.json superobject
我需要加载一个 JSON 文件,更改一个值,然后将其写回磁盘。
使用 SuperObject 很容易,但我如何使用 System.JSON 单元做同样的事情?
const
PathToX = 'AllCategories.Category[0].subCategory[0].products[0].views.view[0].x';
var
JsonFilename: string;
JO: ISuperObject; // from the SuperObject unit
JV: TJsonValue; // from the System.Json unit
begin
JsonFilename := ExtractFilePath(Application.ExeName)+'product.json');
// Using the SuperObject unit:
JO := SO(TFile.ReadAllText(JsonFilename));
WriteLn('The old value of "x" is ', JO[PathToX].AsString);
WriteLn('Changing value of x to "123"');
JO.S[PathToX] := '123'; // Set the value of "x"
WriteLn('The new value of "x" is ', JO[PathToX].AsString);
// Now trying to do the same thing using the System.Json unit:
JV := TJSONObject.ParseJsonValue(TFile.ReadAllText(JsonFilename));
WriteLn('The old value of "x" is ', JV.GetValue<string>(PathToX));
WriteLn('Changing value of x to "123"');
// Question: What code should go here to set the value of "x" using System.JSON ???
WriteLn('The new value of "x" is ', JV.GetValue<string>(PathToX));
Run Code Online (Sandbox Code Playgroud)
似乎没有与 System.JSON 中的“GetValue”方法等效的“SetValue”。
TJSONObject确实支持类似于 SuperObject 的路径评估器。因此,您不必一次一个对象地手动钻入 JSON 值树(尽管您当然可以,如果您愿意的话)。
然而,这些System.JSON类实际上并不是为修改现有数据而设计的(信不信由你)!它们专为解析数据和创建新数据而设计。所有表示简单值(整数、布尔值、字符串)的 JSON 类都是只读的。幸运的是,TJSONPair该类允许替换值,因此您必须利用这一点。
尝试这样的事情:
uses
..., System.JSON;
var
JsonFilename: string;
JV: TJSONValue;
JO: TJSONObject;
JoX: Integer;
JoPair: TJSONPair;
begin
JsonFilename := ExtractFilePath(Application.ExeName) + 'product.json';
JV := TJSONObject.ParseJSONValue(TFile.ReadAllText(JsonFilename));
if JV = nil then raise Exception.Create('Cannot parse file: ' + JsonFilename);
try
JO := JV as TJSONObject;
JoX := JO.GetValue<Integer>('AllCategories.Category[0].subCategory[0].products[0].colors.color[0].views.view[0].x');
WriteLn('The old value of "x" is ', JoX);
WriteLn('Changing value of "x" to "123"');
JoPair := JO.GetValue<TJSONObject>('AllCategories.Category[0].subCategory[0].products[0].colors.color[0].views.view[0]').Get('x');
JoPair.JsonValue.Free;
JoPair.JsonValue := TJSONNumber.Create(123);
WriteLn('The new value of "x" is ', JoPair.JsonValue.Value);
SaveAsDialog.FileName := JsonFilename;
if SaveAsDialog.Execute then TFile.WriteAllText(SaveAsDialog.FileName, JO.ToJSON);
finally
JV.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
或者:
uses
..., System.JSON;
var
JsonFilename: string;
JV: TJSONValue;
JO: TJSONObject;
JoX: TJSONPair;
begin
JsonFilename := ExtractFilePath(Application.ExeName) + 'product.json';
JV := TJSONObject.ParseJSONValue(TFile.ReadAllText(JsonFilename));
if JV = nil then raise Exception.Create('Cannot parse file: ' + JsonFilename);
try
JO := JV as TJSONObject;
JoX := JO.GetValue<TJSONObject>('AllCategories.Category[0].subCategory[0].products[0].colors.color[0].views.view[0]').Get('x');
WriteLn('The old value of "x" is ', JoX.JsonValue.Value);
WriteLn('Changing value of "x" to "123"');
JoX.JsonValue.Free;
JoX.JsonValue := TJSONNumber.Create(123);
WriteLn('The new value of "x" is ', JoX.JsonValue.Value);
SaveAsDialog.FileName := JsonFilename;
if SaveAsDialog.Execute then TFile.WriteAllText(SaveAsDialog.FileName, JO.ToJSON);
finally
JV.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)