2013-08-16 84 views
3

在我的小型庫中,我正在編寫一個側面項目,我使用RestSharp從Web API獲取Json。對模型類的反序列化對於簡單類型來說工作正常,但在請求時存在結果類型未知(或不清楚)的端點。將JSON動態地反序列化爲基於內容的派生類型?

具體來說,它的GuildWars2 API v1和一個例子是項目數據。當然,每件商品都有基本屬性,並根據查詢的商品設置附加值。例如武器有一些修飾符等等。

我的想法是爲所有基本屬性創建一個抽象的Item類,並從該類派生出所有現有的子類型的項目添加所需的屬性。我的問題是,如何決定將哪個子類反序列化。我已經閱讀過有關爲Json字符串添加限定類型名稱的各種方法,但由於我只從API獲取數據,因此我無法影響即將得到的響應。

我想理想情況下總是想反序列化到基類Item中,通過解串器通過Json字符串中包含的給定屬性決定實際類型。這是否可能?還是有更好的方法來解決這個問題?

在此先感謝

編輯:這是一個武器的例子JSON:

{ 
    "item_id": "30704", 
    "name": "Twilight", 
    "description": "", 
    "type": "Weapon", 
    "level": "80", 
    "rarity": "Legendary", 
    "vendor_value": "100000", 
    "icon_file_id": "456031", 
    "icon_file_signature": "CE3AF0B7B9BB6244726779F5B6A930541BA6C15F", 
    "game_types": ["Activity", "Dungeon", "Pve", "Wvw"], 
    "flags": ["HideSuffix", "NoSell", "SoulBindOnUse"], 
    "restrictions": [], 
    "weapon": { 
    "type": "Greatsword", 
    "damage_type": "Physical", 
    "min_power": "995", 
    "max_power": "1100", 
    "defense": "0", 
    "infusion_slots": [], 
    "infix_upgrade": { 
     "attributes": [ 
     { 
      "attribute": "Power", 
      "modifier": "179" 
     }, 
     { 
      "attribute": "Power", 
      "modifier": "179" 
     } 
     ] 
    }, 
    "suffix_item_id": "24599" 
    } 
} 

,這將是一個護甲片:

{ 
    "item_id":"500", 
    "name":"Carrion Conjurer Chest of Dwayna", 
    "description":"", 
    "type":"Armor", 
    "level":"68", 
    "rarity":"Rare", 
    "vendor_value":"257", 
    "icon_file_id":"61023", 
    "icon_file_signature":"76CD08463A05730071D400254141B50E570662D3", 
    "game_types":["Activity", "Dungeon", "Pve", "Wvw"], 
    "flags":["SoulBindOnUse"], 
    "restrictions":[], 
    "armor": { 
    "type":"Coat", 
    "weight_class":"Light", 
    "defense":"221", 
    "infusion_slots":[], 
    "infix_upgrade": { 
     "attributes": [ 
     { 
      "attribute":"ConditionDamage","modifier":"70" 
     }, 
     { 
      "attribute":"Power","modifier":"50" 
     } 
     ] 
    }, 
    "suffix_item_id":"24767" 
    } 
} 

我想反序列化基於「類型」屬性的內容,但我不明白,這將如何工作=/

+1

你能展示一個你從API獲得的JSON的例子嗎? – mallan1121

+0

@ mallan1121編輯我的帖子 – MrFloya

回答

3

您可以使用JObject解析您的JSON數據,然後將其用作關聯數組。

string json = @"{ 
    "item_id": "30704", 
    "name": "Twilight", 
    "description": "", 
    "type": "Weapon", 
    ... 
}"; 

JObject o = JObject.Parse(json); 

Item item = null; 
switch (o["type"]) 
{ 
    case "Weapon": 
     item = JsonConvert.DeserializeObject<Weapon>(json); 
    break; 
    case "Armor": 
     item = JsonConvert.DeserializeObject<Armor>(json); 
    break; 
    default: 
     // throw error? 
} 

,然後你就會有一個基類,例如:

public class Item 
{ 
    public string item_id { get; set; } 
    public string name { get; set; } 
    public string description { get; set; } 
    public string type { get; set; } 
    ... 
    // List all common properties here 
    public Item() { } 
    // It's important to have the public default constructor implemented 
    // if you intend on overloading it for your own purpose later 
} 

而且你的武器類可能是這樣:

public class Weapon : Item // Weapon extends Item 
{ 
    public WeaponDetails weapon { get; set; } 
    public Weapon() { } 
} 

和武器的詳細信息:

public class WeaponDetails 
{ 
    public string type { get; set; } 
    public string damage_type { get; set; } 
    public int min_power { get; set; } 
    public int max_power { get; set; } 
    ... 
    public WeaponDetails() { } 
} 
+0

非常感謝您的回答!這正是我想象的。我還有一個問題。這段代碼不會解析JSON兩次嗎?首先作爲JObject,然後作爲合適的類型?這不是一個大問題,但是在我需要解析大量JSON的情況下,這可能是一個問題。 – MrFloya

相關問題