从TJsonObject中移除Pair


{
"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;

最新更新