2016-02-03 6 views
3

Имея JSon строк, как это (я не имею никакого контроля над издателем):Deserialize JSON строки в зависимости от типа

{ 
    "TypeName": "Type1" 
} 

{ 
    "TypeName": "Type1" 
} 

Является ли это приемлемым способом десериализации строки JSon динамически ?:

public class DeserializationFactory 
{ 
    public static IPoco GetEvent(string jsonString) 
    { 
     var o = JObject.Parse(jsonString); 
     IPoco poco = null; 
     switch (o["TypeName"].ToString()) 
     { 
     case "Type1": 
      poco = JsonConvert.DeserializeObject<Type1>(jsonString); 
      break; 

     case "Type2": 
      poco = JsonConvert.DeserializeObject<Type2>(jsonString); 
      break; 
     } 
     return poco; 
    } 
} 
+0

вы говорите, вы не s ure, в котором Poco вам следует десериализовать? – Greg

+0

Не совсем. Это зависит от значения «TypeName» – cs0815

+0

Возможно, вы захотите сделать это с помощью 'JsonConverter', если ваш' IPoco' будет включен в некоторый объект более высокого уровня. См. Http://stackoverflow.com/questions/19307752/deserializing-polymorphic-json-classes-without-type-information-using-json-net или http://stackoverflow.com/questions/29528648/json-net-serialization -of-типа с-полиморфного-ребенка-объекта – dbc

ответ

1

вы можете попробовать с JsonSubtypes реализации преобразователя и этот макет:

[JsonConverter(typeof(JsonSubtypes), "TypeName")] 
    [JsonSubtypes.KnownSubType(typeof(Type1), "Type1")] 
    [JsonSubtypes.KnownSubType(typeof(Type2), "Type2")] 
    public interface IPoco 
    { 
     string TypeName { get; } 
    } 

    public class Type1 : IPoco 
    { 
     public string TypeName { get; } = "Type1"; 
     /* ... */ 
    } 

    public class Type2 : IPoco 
    { 
     public string TypeName { get; } = "Type2"; 
     /* ... */ 
    } 
Смежные вопросы