2012-08-14 15 views
6

Estoy trabajando en una solución de espacio aislado en Sharepoint, las restricciones importantes (con respecto a esta pregunta) debido a que son el uso de .NET 3.5 y no se permiten las reflexiones.Deserializar cadena JSON en C# sin usar el reflejo


Ejemplo 1

Si trato de deserializar como cadena JSON en una clase simple como esto funciona bien:

JSON CADENA

{"field":"Picture1","url":"whatever"} 

C# CLASE

public class PictureSetting 
{ 
    public string field { get; set; } 
    public string url { get; set; } 
} 

Ejemplo 2

Pero si trato de deserializar un poco cadena más compleja consigo un error:

JSON CADENA

{ 
    "Rows": [ 
    { 
     "Columns": [ 
     { 
      "Width": "100" 
     } 
     ] 
    }  
    ] 
} 

C# CLASES

internal class PageStructure 
{ 
    public List<StructureElement> Rows { get; set; } 
    public PageStructure() 
    { 
     Rows = new List<StructureElement>(); 
    } 
} 

internal class StructureElement 
{ 
    public List<BlockAssigment> Columns { get; set; } 
    public StructureElement() 
    { 
     Columns = new List<BlockAssigment>(); 
    } 
} 

internal class BlockAssigment 
{ 
    public string Width { get; set; } 
} 

ERROR

Solicitud de permiso de tipo 'System.Security.Permissions.ReflectionPermission mscorlib versión = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 ' ha fallado.


* Deserialización

El código que utilizo para la deserialización de ambos ejemplos es simplemente .net estándar:

var serializer = new JavaScriptSerializer(); 
var obj = serializer.Deserialize<PageStructure>("jsonstring"); 

Así que parece que para el primer ejemplo .net es no usando la reflexión porque eso funciona. Entonces la pregunta es:

¿Hay alguna manera de deserializar el segundo ejemplo sin tener .net usando la reflexión internamente?

Modificar las cadenas JSON y C# no son un problema, solo tengo que mantener la estructura (objeto base con filas, incluidas las columnas) de alguna manera.

Respuesta

3

Sospecho que el mayor problema es en realidad aquí:

public class PictureSetting // public, works 

frente

internal class PageStructure // non-public, permission denied 

me suena igual que la caja de arena es la prevención de la reflexión de no públicas Típicos/ miembros. Esto sería coherente con la mayoría de las cajas de arena, por ejemplo, Silverlight: puede usar el reflejo, pero solo para cosas que el podría podría hacer normalmente, es decir, acceder a tipos/miembros públicos. Intente hacer PageStructure, StructureElement y BlockAssigment en las clases public.

+0

Sí, eso es todo! Impresionante, muchas gracias! Lo cambié a público y funciona. Entonces, parece que el sandbox NO está prohibiendo el reflejo en general, pero no es público como usted dijo. Interesante. Aprendo un poco todos los días :) – Marc

-1

Puede usar este servicio http://json2csharp.com/ para generar clases C# correctas para analizar json.

+1

Muy buen enlace, gracias! Pero no tiene nada que ver con la pregunta en absoluto ... – Marc

Cuestiones relacionadas