我的項目通過UDP獲取了很多JSON字符串,每個字符串都描述了一些對象列表。 我不能寫一個函數來獲取一個列表,並將Derialization設置爲這個列表。 問題是,如果不知道構成列表的對象的類名稱,我就無法進行Derialization。 我試圖給每個部門ID字段..但在這裏,我也無法做特定字段的Derialization,因爲部門名稱不知道。JSON反序列化中的瑕疵
有沒有人有解決方案?
我的項目通過UDP獲取了很多JSON字符串,每個字符串都描述了一些對象列表。 我不能寫一個函數來獲取一個列表,並將Derialization設置爲這個列表。 問題是,如果不知道構成列表的對象的類名稱,我就無法進行Derialization。 我試圖給每個部門ID字段..但在這裏,我也無法做特定字段的Derialization,因爲部門名稱不知道。JSON反序列化中的瑕疵
有沒有人有解決方案?
是的,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;
}
序列化過程中,你會明確序列ObjectData
到ObjectInJSON
。然後發送序列化的JSONOBjectWrapper。
在傳入方面你總是知道它是JSONObjectWrapper。反序列化它 - 通過這個,您可以獲得帶有對象和對象類型的JSON。找到這個對象類型,使用一些工廠創建它,然後將它從OBjectInJSON
反序列化爲ObjectData
。
只有在發送端可以進行包裝時,上述步驟纔有效。否則,你就搞砸了:-)
我選擇了這個解決方案.. tnx! –
要讓所有的實體獲得從基類來實現:
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
{
...
}
在**至少包含一個導致問題的** JSON輸入示例,**理想** **代碼嘗試反序列化它。 –
你有沒有機會影響你的數據? – Zoka