2011-04-08 20 views
5

Estoy usando .NET JavascriptSerializer para deserializar JSON en objetos de tiempo de ejecución y, en su mayor parte, la asignación entre campos JSON y campos de objeto ha sido automática. Sin embargo, me enfrento al siguiente escenario y agradecería consejos sobre cómo manejarlo.¿Cómo tratar con JSON y objetos variantes?

Imagine que tenemos una representación JSON de una forma, que puede ser un cuadrado o un círculo. Por ejemplo,

{"ShapeType":"Circle","Shape":{"Color":"Blue", "Radius":"5.3"}} 

o

{"ShapeType":"Square","Shape":{"Color":"Red", "Side":"2.1"}} 

Estas cadenas JSON son el modelo de la jerarquía de clases se muestra a continuación.

class ShapePacket 
{ 
    public string ShapeType; // either "Square" or "Circle" 
    public Shape Shape; 
} 

class Shape // all Shapes have a Color 
{ 
    public string Color; 
} 

class Square : Shape 
{ 
    public float Side; 
} 

class Circle : Shape 
{ 
    public float Radius; 
} 

simplemente llamando JavascriptSerializer.Deserialize no funciona en este caso, donde hay un tipo de variante en cuestión. ¿Hay alguna manera de convencer JavascriptSerializer para deserializar a pesar de la "rama" en mi tipo de datos? También estoy abierto a soluciones de terceros.

+0

Parece similar a esta pregunta [serialización JSON de matriz con objetos polimórficos] (http://stackoverflow.com/questions/5186973/json-serialization-of-array-with-polymorphic-objects). – R0MANARMY

Respuesta

2

La rama en su tipo de datos probablemente necesita una bifurcación en su código. No creo que haya una manera de hacer esto además de la manera explícita.

Me gustaría hacer esto en dos pasos:

En primer lugar, a su vez, el objeto JSON entrante en un hash sin tipo usando JsonConvert.DeserializeObject

A continuación, manualmente se ramifican en el campo 'shapeType' para elegir la adecuada Shape clase (Square o Circle), y construya una instancia usted mismo.

(solución explícita incluyen aquí para la posteridad, aunque sospecho que no necesita mi ayuda con ella;)

1

creo que es necesario para inicializar el JavaScriptSerializer con una aplicación como esta JavaScriptTypeResolver (SimpleTypeResolver se construye -in en la biblioteca de clases):

new JavaScriptSerializer(new SimpleTypeResolver()); 

para habilitar la resolución de tipo automático. Creo que como resultado agregará un campo de tipo __type al JSON de salida, que luego usará para resolver el tipo.

Cuestiones relacionadas