JSON反序列化中的问题

本文关键字:问题 反序列化 JSON | 更新日期: 2023-09-27 18:23:50

我的项目通过UDP获得了很多JSON字符串,每个字符串都描述了一些对象列表。我无法编写一个函数来获得某个列表,并对该列表进行Derivalization。问题是,在不知道组成列表的对象的类名的情况下,我无法进行Derivalization。我试着给每个部门的ID字段。。但在这里,我也不能对特定的字段进行派生,因为哪里的部门名称是未知的。

有人有解决方案吗?

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

只有当您可以在传输侧进行包裹时,上述程序才会起作用。否则,你就完蛋了:-)

让所有实体都从基类中实现

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
{
   ...
}