JSON反序列化的问题

时间:2013-07-19 10:55:16

标签: c# json deserialization

我的项目通过UDP获取大量JSON字符串,每个字符串描述一些对象列表。 我不能编写一个获得一些列表的函数,并将Derialization设置为此列表。 问题是,如果不知道构成列表的对象的类名,我就无法进行Derialization。 我试图给每个部门ID字段..但是在这里,我也不能为特定字段做Derialization,因为部门名称不知道。

有没有人有解决方案?

2 个答案:

答案 0 :(得分:2)

让所有实体从Base类实现:

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

Zoka的编辑№2

如果您需要从任何其他第三方库类实现您的DTO,请执行以下操作:

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

public class EntityFive : BaseEntity
{
   ...
}

答案 1 :(得分: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;
}

在序列化过程中,您会明确将ObjectData序列化为ObjectInJSON。然后发送序列化的JSONOBjectWrapper。

在传入方面,您始终知道它是JSONObjectWrapper。反序列化 - 通过这种方式,您可以获得具有对象和对象类型的JSON。找到此对象类型,使用某个工厂创建它,然后将其从OBjectInJSON反序列化为ObjectData

只有在发送方进行包装时,上述步骤才有效。否则,你被搞砸了: - )