2012-04-12 15 views
8

Para deserializar un objeto json, tuve que definir una clase padre que contendría un objeto o una matriz de objetos para la clase hija. Tiene que ser un objeto si se recuperó un objeto o una matriz de objetos si se recuperó una matriz de json.¿Cómo comprobar si una variable es Array u Object?

JSON matriz de objetos

{"y":{"x":[{"data":28}, {"data":56}, {"data":89}]}} 

JSON objeto

{"y":{"x":{"data":28}}} 

y está recibiendo x a la vez, y x [] en otro momento. No existe tal condición para determinar si y recibiría una matriz o un objeto.

Por lo tanto, para determinar si recibí una matriz o no, estoy comprobando la condición IsArray().

me trataron

class Y 
{ 
    public X x { get { return System.IsArray() ? new X() : new x[] }; set; } 
} 

class X 
{ 
    public int data { get; set; } 
} 
  1. Se isnt de trabajo.
  2. System.IsArray() no se reconoce?
+2

¿Tiene control sobre la lógica que genera el JSON? De ser así, debería considerar rediseñar los objetos de datos para cumplir con un contrato estándar. Tener una propiedad que a veces es un solo objeto y, a veces una matriz, es un diseño pobre y problemático a largo plazo.Si tiene la capacidad, debería considerar hacer una matriz y construir sus modelos de objetos para dar cuenta de eso. –

+0

[IsArray] (http://msdn.microsoft.com/en-us/library/system.type.isarray.aspx) comprueba un 'Tipo'. Debe verificarlo en el objeto que le interesa verificar, no en 'Sistema'. – Default

Respuesta

12

Primero, una matriz es un objeto. Eso es una buena cosa, ya que permite a estas funciones para trabajar (ambos asumen using System;):

bool IsArray(object o) { return o is Array; } 
bool IsArray(object o) { return o.GetType().IsArray; } 

En segundo lugar, si quieres una propiedad cuyo tipo puede ser X o X[], tipo de la propiedad tiene que ser object:

class Y    
{ 
    private object _x; 
    public object x { 
     get { return _x; } 
     set 
     { 
      if (value.GetType != typeof(X) && value.GetType != typeof(X[])) 
       throw new ArgumentException("value"); 
      _x = value; 
     } 
    } 
} 

Esto de alguna manera ignora la ventaja del tipado estático, ya que está usando object y revisando los tipos en tiempo de ejecución. Sería mucho más simple definir la propiedad como una matriz, incluso para aquellos casos en los que solo hay un valor. En tales casos, sería una matriz cuya longitud es 1.

1

La propiedad x del Tipo X en la clase Y no puede ser una matriz de X si su explicidad dice que es del tipo X. Declararlo como un objeto sería una forma de evitarlo.

Si desea comprobar que es una matriz que usaría un campo de respaldo (por ejemplo _x) y, a continuación, donde se utiliza la propiedad hacer una verificación (typeof(_x) == X[])

que podrían causar problemas, sin embargo, mi mejor consejo sería establecer el tipo de propiedad x a X [] y en el conjunto determinar si el valor era una matriz (si es así, simplemente configure _x = value) o si no agrega valor a una matriz vacía de X

4

He estado usando el paquete Nuget Json.NET, y ha sido muy fácil trabajar con él:

string jsonStr = "{'y':{'x':[{'data':28}, {'data':56}, {'data':89}]}}"; 
    dynamic jobject = JsonConvert.DeserializeObject(jsonStr); 

    bool isArray = jobject.y.x.Type == JTokenType.Array; 
    bool isObject = jobject.y.x.Type == JTokenType.Object; 

Espero que esto ayude!

Cuestiones relacionadas