Estou tentando fazer JSON funcionar no C++Builder. Tenho olhado o código para Delphi sobre como criar um arquivo JSON, e todos eles parecem criar as partes Doc e Data do arquivo/string JSON, mas liberam apenas o Doc.
Por exemplo:
void __fastcall TMainForm::Panel1Click(TObject* Sender)
{
std::unique_ptr<TJSONObject> jsonDoc { new TJSONObject() };
TJSONObject* jsonData = new TJSONObject();
jsonDoc->AddPair("cmd", rdsNowPlaying);
jsonDoc->AddPair("station", "WBCB_FM");
jsonDoc->AddPair("data", jsonData);
jsonData->AddPair("testNull", new TJSONNull() );
jsonData->AddPair("testTrue", new TJSONBool(true) );
jsonData->AddPair("testFalse", new TJSONBool(false) );
Memo1->Lines->Text = jsonDoc->Format(3);
}
Dá jsonDoc->AddPair("data", jsonData);
"propriedade" de jsonData
para jsonDoc
? Então quando jsonDoc
é liberado, jsonData
é liberado também?
Atribui jsonData->AddPair("testTrue", new TJSONBool(true) );
a propriedade do TJSONBool
para jsonData
e ele é liberado quando jsonData
é liberado?
O disparo do OnClick
evento é exibido corretamente, mas é outra questão "Como eu libero (delete) a memória"? Ou std::unique_ptr
e ele TJSONObject
cuida de si mesmo?
ps rdsNowPlaying
é enum
declarado no cabeçalho.
Por padrão, o valor JSON de nível superior possui todos os objetos filhos em sua hierarquia. Então sim, liberar
jsonDoc
liberará tudo que estiver dentro dele.Owned
Você pode definir manualmente uma propriedade de valor JSONfalse
se quiser assumir a propriedade de algo.ATUALIZAR:
Dito isso, no seu exemplo de código em particular,
AddPair()
tem o potencial de lançar uma exceção, e se isso acontecer enquanto você estiver chamandonew
um de seus parâmetros, você vazará essenew
objeto 'ed antes quejsonDoc
possa assumir a propriedade dele. Se você estiver indo paranew
um objeto diretamente, certifique-sedelete
de que você não seja capaz de transferir a propriedade dele.unique_ptr
pode ajudá-lo com isso, por exemplo:No caso de seus booleanos (e inteiros e strings), você pode usar as
AddPair()
sobrecargas que criam objetos JSON para você (infelizmente, não há nenhum método que crie umTJSONNull
para você), por exemplo: