{
"Test":{
"A":{
"ins":{
"type":"pac",
"id":{
"values":{
"test_number":"156764589",
"val":"abcde",
"val_2":"gggg",
"val_3":"jjjj"
},
"verif":{
},
"bool":"INSTR"
}
}
},
"resp":{
"image":"include"
},
"op":{
"id":{
"meth":"def"
}
}
}
}
我正在记录一个http请求被发送&需要从TJsonObject
中删除一个元素以保护隐私。然而,当我试图删除键和日志时,它仍然存在
TJSONObject *obj = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::UTF8->GetString(id_http_wrap.msg));
obj->RemovePair("Test.A.ins.type.id.values.test_number");
首先,你走错了路。type
不在通往test_number
的路径上。正确的应该是:
obj->RemovePair("Test.A.ins.id.values.test_number");
但据我所知,RemovePair
无法解析。你必须使用FindValue
:
// Cast helper:
TJSONObject* ToTJSONObject(TJSONValue* v) {
auto obj = dynamic_cast<TJSONObject*>(v);
if(!obj) throw Exception("v is not a TJSONObject");
return obj;
}
auto obj = ToTJSONObject(TJSONObject::ParseJSONValue(...));
TJSONPair* removed =
ToTJSONObject(obj->FindValue("Test.A.ins.id.values"))->RemovePair("test_number");
if(removed) {
// successfully removed: removed->ToString()
// the resulting JSON document: obj->ToString()
}
这应该能奏效:
implementation
uses
System.IOUtils, System.JSON;
procedure DoSomeJSONStuff;
var
jsonstr: string;
jo, jochild: TJSONObject;
begin
jsonstr := TFile.ReadAllText('C:Tempexample.json', TEncoding.UTF8);
jo := TJSONObject.ParseJSONValue(jsonstr) as TJSONObject;
if (jo <> nil) then begin
try
jochild := ((((jo.GetValue('Test') as TJSONObject).GetValue('A') as TJSONObject).GetValue('ins') as TJSONObject).GetValue('id') as TJSONObject).GetValue('values') as TJSONObject;
jochild.RemovePair('test_number');
TFile.WriteAllText('C:Tempexample_changed.json', jo.ToString, TEncoding.UTF8);
finally
jo.Free;
end;
end;
end;
请记住,TFile。使用UTF-8编码的ReadAllText和WriteAllText实际上是UTF-8- bom。
当然,您可以更好地格式化代码。
在kbmMW中可以这样做:
const JSON: string =
'{'+
' "Test":{'+
' "A":{'+
' "ins":{'+
' "type":"pac",'+
' "id":{'+
' "values":{'+
' "test_number":"156764589",'+
' "val":"abcde",'+
' "val_2":"gggg",'+
' "val_3":"jjjj"'+
' },'+
' "verif":{'+
' },'+
' "bool":"INSTR"'+
' }'+
' }'+
' },'+
' "resp":{'+
' "image":"include"'+
' },'+
' "op":{'+
' "id":{'+
' "meth":"def"'+
' }'+
' }'+
' }'+
'}';
procedure TForm1.Button1Click(Sender: TObject);
var
str:TkbmMWJSONStreamer;
js,o:TkbmMWONCustomObject;
begin
str:=TkbmMWJSONStreamer.Create;
try
js:=str.LoadFromUTF16String(JSON);
o:=js.Path('Test/A/ins/id/values');
if o.IsObject then
TkbmMWONObject(o).Remove('test_number');
Memo1.Lines.DelimitedText:=JSON;
Memo2.Lines.DelimitedText:=str.SaveToUTF16String(js);
finally
str.Free;
end;
end;