JSON反序列化中的问题
本文关键字:问题 反序列化 JSON | 更新日期: 2023-09-27 18:23:50
我的项目通过UDP获得了很多JSON字符串,每个字符串都描述了一些对象列表。我无法编写一个函数来获得某个列表,并对该列表进行Derivalization。问题是,在不知道组成列表的对象的类名的情况下,我无法进行Derivalization。我试着给每个部门的ID字段。。但在这里,我也不能对特定的字段进行派生,因为哪里的部门名称是未知的。
有人有解决方案吗?
是的,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
。
只有当您可以在传输侧进行包裹时,上述程序才会起作用。否则,你就完蛋了:-)
让所有实体都从基类中实现
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,请这样做:
public abstract class BaseEntity : AnyOther3rdPartyLibraryClass
{
public EntityTypeEnum EntityType {get;set;}
}
public class EntityFive : BaseEntity
{
...
}