2013-07-19 73 views
2

我的項目通過UDP獲取了很多JSON字符串,每個字符串都描述了一些對象列表。 我不能寫一個函數來獲取一個列表,並將Derialization設置爲這個列表。 問題是,如果不知道構成列表的對象的類名稱,我就無法進行Derialization。 我試圖給每個部門ID字段..但在這裏,我也無法做特定字段的Derialization,因爲部門名稱不知道。JSON反序列化中的瑕疵

有沒有人有解決方案?

+2

在**至少包含一個導致問題的** JSON輸入示例,**理想** **代碼嘗試反序列化它。 –

+0

你有沒有機會影響你的數據? – Zoka

回答

2

是的,JSON的問題。 我會去封裝的方式。 首先,我將創建包裝:

public class JSONObjectWrapper 
{ 
    public string ObjectType; 
    public string ObjectInJSON; 
    [DoNotSerialize] // sorry do not remember the attribute to exclude it from serialization 
    public object ObjectData; 
} 

序列化過程中,你會明確序列ObjectDataObjectInJSON。然後發送序列化的JSONOBjectWrapper。

在傳入方面你總是知道它是JSONObjectWrapper。反序列化它 - 通過這個,您可以獲得帶有對象和對象類型的JSON。找到這個對象類型,使用一些工廠創建它,然後將它從OBjectInJSON反序列化爲ObjectData

只有在發送端可以進行包裝時,上述步驟纔有效。否則,你就搞砸了:-)

+0

我選擇了這個解決方案.. tnx! –

2

要讓所有的實體獲得從基類來實現:

public abstract class BaseEntity 
{ 
    public EntityTypeEnum EntityType {get;set;} 
} 

public enum EntityTypeEnum 
{ 
    EntityOne, 
    EntityTwo, 
    EntityThree 
} 

現在,你可以從JSON到BaseEntity的遊戲內你的實體反序列化,看看你會得到什麼樣的實體,然後結束反序列化的類型,你得到。

JsonSerializer js = new JsonSerializer(); 
    var baseEntity = js.Deserialize<BaseEntity>() 
    switch(baseEntity.EntityType) 
    { 
     case EntityOne: 
     var result= js.Deserialize<EntityOne>(); 
     //DoSomeThing 
     break; 
     case EntityTwo: 
     var result= js.Deserialize<EntityTwo>(); 
     //DoSomeThing 
     break; 
    } 

編輯Zoka

如果你想實現什麼都在你的實體,你可以這樣做:

public class AnythingElse : BaseEntity 
{ 
    //... 
} 

public class EntityFour : AnythingElse 
{ 
    //.... 
} 

編輯№2爲Zoka

如果您需要將您的DTO從任何其他第三方庫類ju中實施st這樣做:

public abstract class BaseEntity : AnyOther3rdPartyLibraryClass 
{ 
    public EntityTypeEnum EntityType {get;set;} 
} 

public class EntityFive : BaseEntity 
{ 
    ... 
} 
+0

準確地說 - 這個解決方案比我的更好(因此+1),但是如果你不能從其他任何東西繼承你的數據,那就沒用了。然後,我的解決方案更好 - 非侵入性。 – Zoka

+0

你可以繼承。我修改了我的答案。 – Maris

+0

也許你不能。如果您需要從第三方DLL發送'class X',該怎麼辦? – Zoka