Delphi用抽象类对JSON进行反序列化



我想用内置函数TJson.JsonToObject<T>TJson.ObjectToJsonObject序列化和反序列化一个对象。该对象包含一些嵌套对象,其中一个是抽象类型。有没有可能告诉反序列化器,要创建哪个具体对象?我可以使用自定义json拦截器这个嵌套的对象吗?

类定义如下:

type
TAngPos = class (TObject)
strict private
var
FPrimkey: Integer;
FAng_ID: Integer;
FPosNr: Integer;
FArt_ID: Integer;

FPositionstyp: TPositionstyp; // <--- abstract
end;
type
TPositionstyp = class abstract (TObject)
strict protected
var
FArtikel: TArtikel;
end;
type
TPositionstypArtikel = class (TPositionstyp);
type
TPositionstypAngPosKonf = class (TPositionstyp)
strict private
var
FGrundeinheit: TAngPos;
FEinbaukomponenten: TObjectList<TAngPos>;
end;
type
TArtikel = class (TObject)
strict private
var
FPrimkey: Integer;
FStatus: Integer;
FTyp: Integer;
FBeschreibung: string;
FHerstellerNr: string;
end;

对应的JSON看起来像这样:

TPositionstypArtikel:

{
"primkey": 23930,
"ang_ID": 2400,
"posNr": 40,
"art_ID": 46210,
"positionstyp": { // PositionstypArtikel
"artikel": {
"primkey": 46210,
"status": 1,
"typ": 2,
"beschreibung": "MyDescription",
"herstellerNr": "MyVendorNr"
}
}
}

对于TPositionstypAngPosKonf

{
"primkey": 2,
"ang_ID": 1,
"posNr": 10,
"art_ID": 44041,
"positionstyp": { // TPositionstypAngPosKonf
"grundeinheit": { // <-- TAngPos
"primkey": 33067,
"ang_ID": 0,
"posNr": 20,
"art_ID": 44092,
"positionstyp": {
"artikel": {
"primkey": 44092,
"status": 2,
"typ": 4,
"beschreibung": "MyDescriptionGrundeinheit",
"herstellerNr": "MyVendorNrGrundeinheit"
}
}
},
"einbaukomponenten": { // <-- TObjectList<TAngPos>
"ownsObjects": true,
"listHelper": [
{
"primkey": 33068,
"ang_ID": 0,
"posNr": 30,
"art_ID": 44399,
"positionstyp": {
"artikel": {
"primkey": 44399,
"status": 2,
"typ": 4,
"beschreibung": "MyDescriptionEinbaukomponente1",
"herstellerNr": "MyVendorNrEinbaukomponente1"
}
}
},
{
"primkey": 33069,
"ang_ID": 0,
"posNr": 40,
"art_ID": 44398,
"positionstyp": {
"artikel": {
"primkey": 44398,
"status": 2,
"typ": 4,
"beschreibung": "MyDescriptionEinbaukomponente2",
"herstellerNr": "MyVendorNrEinbaukomponente2"
}
}
}
]
},
"artikel": {
"primkey": 44041,
"status": 1,
"typ": 3,
"beschreibung": "MyDescriptionKonfKopf",
"herstellerNr": ""
}
}

对象反序列化后,我可以检查嵌套对象是否具有is-操作符的特定类型,但不幸的是它既不是TPositionstypArtikel也不是TPositionstypAngPosKonf

谢谢你的评论。我最终改变了课程结构。它不再包含抽象类型,而是包含TPositionstypAngPosKonf类型的单独变量,该变量可能是nil,也可能不是。来自TPositionstypTArtikel现在直接驻留在TAngPos中,TPositionstypTPositionstypArtikel两个类不再存在。它看起来就像这样

type
TAngPos = class (TObject)
strict private
var
FPrimkey: Integer;
FAng_ID: Integer;
FPosNr: Integer;
FArt_ID: Integer;

FArtikel: TArtikel;
FPositionstypAngPosKonf: TPositionstypAngPosKonf; // may be nil
end;
type
TPositionstypAngPosKonf = class (TObject)
strict private
var
FGrundeinheit: TAngPos;
FEinbaukomponenten: TObjectList<TAngPos>;
end;
type
TArtikel = class (TObject)
strict private
var
FPrimkey: Integer;
FStatus: Integer;
FTyp: Integer;
FBeschreibung: string;
FHerstellerNr: string;
end;

最新更新