[英]How to create a C# class with 'flexible' properties?
我正在嘗試編寫一個 JSON 文件,該文件包含一系列問題,每個問題基本上具有以下結構:
{
"values": [
"oui"
],
"question": "h_d",
"type": "radio",
"conditions": {
"lhs": {
"question": "valeur_wed"
},
"operator": "eq",
"rhs": 0
},
"conditionalInfo": []
},
生成 JSON 文件的方法是創建一個JSONQuestion
class,為此我為每個問題創建一個新實例,並為屬性提供不同的值。 然后我執行JsonSerializer.Serialize(list_of_JSONQuestion_instances)
以獲得我的 JSON 文本文件(使用 System.Text.Json)。
現在,這一切都很好,除了每個問題中的“條件”元素實際上應該更靈活。 例如,“lhs”(和/或“rhs”)本身可以包含一個完整的其他條件,如下所示:
{
"values": [],
"question": "calcul_wed_rugosite_cp",
"conditions": {
"lhs": {
"lhs": {
"question": "valeur_wed"
},
"operator": "eq",
"rhs": "calcule"
},
"operator": "and",
"rhs": {
"lhs": {
"question": "calcul_h_sur_d_script"
},
"operator": "eq",
"rhs": 1
}
},
它甚至可以更深地 go,具有更多的 lhs 和 rhs 級別。 因此,每個問題的左側和右側可能具有不同的復雜性。
因此,我的問題是:如何創建某種具有 3 個屬性( lhs
、 rhs
和operator
)但“靈活”的Condition
class ? 有時rhs
只是一個string
或一個int
,但有時它是一個全新的Condition
istelf。 對於lhs
也是如此。
這完全可行嗎?
我在想用這個:
public class Condition<L, R>
where L : class
where R : class
{
public L lhs { get; set; }
public string @operator { get; set; }
public R rhs { get; set; }
}
...但是如何在我的主要 JSONQuestion class 中聲明“條件”屬性? 因為我顯然不能這樣做:
public class JSONQuestion
{
public string question { get; set; }
public Condition<L, R> conditions { get; set; }
...
}
您可以使用[JsonExtensionData]
屬性。 它允許您聲明一個字典屬性,您可以在反序列化后分析它以查看它包含的內容。 我們主要在需要將 JSON 數據嵌入到我們自己的 JSON 中時使用它。
如果您使用的是 Newtonsoft.JSON:
https://www.newtonsoft.com/json/help/html/DeserializeExtensionData.htm
如果您使用 .NET 的 JSON 實現:
https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-handle-overflow?pivots=dotnet-6-0
我通常會盡量避免使用自定義(反)序列化器,所以我偏向於不使用它們的解決方案。
我會有這樣的數據結構:
public class Node
{
public string? Type{ get; set; } // This decide what other values mean
public string? Value { get; set; }
public Node Lhs? { get; set; }
public string? Operator { get; set; }
public Node? Rhs { get; set; }
}
這非常簡單,但允許表示您顯示的樹。
json 是這樣的:
{
"Type": "Question",
"Value": "calcul_wed_rugosite_cp",
"Lhs": {
"Lhs": {
"Type": "Question",
"Value": "valeur_wed"
},
"Operator": "eq",
"Rhs": {
"Type": "calcule",
"Value": "I'm not sure how 'calcule' condition works"
}
},
"Operator": "and",
"Rhs": {
"Lhs": {
"Type": "Questions",
"Value": "calcul_h_sur_d_script"
},
"Operator": "eq",
"Rhs": {
"Type": "Value",
"Value": "1"
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.