2011-01-17 18 views
6

Tengo un objeto JSON complejo que quiero representar como clase C#. Tengo una ventaja en la clase para padres llamada "Formulario", pero ¿cómo puedo representar una colección para diferentes tipos (vea el objeto "elementos" a continuación)?Cómo convertir clases JSON a C#?

Aquí es el objeto JSON:

{ 
    "action": "index.html", 
    "method": "post", 
    "elements": 
[ 
{ 
    "type": "fieldset", 
    "caption": "User information", 
    "elements": 
    [ 
     { 
      "name": "email", 
      "caption": "Email address", 
      "type": "text", 
      "placeholder": "E.g. [email protected]", 
      "validate": 
      { 
       "email": true 
      } 
     }, 
     { 
      "name": "password", 
      "caption": "Password", 
      "type": "password", 
      "id": "registration-password", 
      "validate": 
      { 
       "required": true, 
       "minlength": 5, 
       "messages": 
       { 
        "required": "Please enter a password", 
        "minlength": "At least {0} characters long" 
       } 
      } 
     }, 
     { 
      "name": "password-repeat", 
      "caption": "Repeat password", 
      "type": "password", 
      "validate": 
      { 
       "equalTo": "#registration-password", 
       "messages": 
       { 
        "equalTo": "Please repeat your password" 
       } 
      } 
     }, 
     { 
      "type": "radiobuttons", 
      "caption": "Sex", 
      "name": "sex", 
      "class": "labellist", 
      "options": 
      { 
       "f": "Female", 
       "m": "Male" 
      } 
     } 
    ] 
] 
} 

La clase tengo inicio se parece a esto:

public class Form 
{ 
    public Guid id 
    { 
     get; 
     set; 
    } 

    public string action 
    { 
     get; 
     set; 
    } 

    public string method 
    { 
     get; 
     set; 
    } 

    public ??? elements 
    { 
     get; 
     set; 
    } 

    public Form() 
    { 

    } 
} 

¿Cómo manejo los "elementos" propiedad para obtener la salida deseada JSON?

Estoy usando WCF 4.0 con estos atributos en el web.config: automaticFormatSelectionEnabled = "false", defaultOutgoingResponseFormat = "Json". Alguna ayuda o ideas serían muy apreciadas.

+0

has visto esto? http://json.codeplex.com/ también ... parece que los elementos serán un objeto personalizado en sí mismo que también necesitarán ser deserializados – timothyclifford

+0

Thx .. Estoy viendo "CustomCreationConverter" de la biblioteca y también estoy pesando usando DataSets. Mi principal preocupación es mantener los valores en la base de datos y administrarlos/modificarlos fácilmente. – TruMan1

Respuesta

1

Wow. Pregunta fascinante Tal vez usar ExpandoObject/dynamic?

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx?PageIndex=4

O anónimos tipos creo que son serializable con la incorporada en el .NET serializador JSON.

+0

Buena idea con tipos dinámicos. Mapearlo en una base de datos no estaría estructurado y la imagen de los tipos dinámicos es lenta (¿reflexión?). Tal vez DataSet y EntityFramework serían una buena forma de hacerlo. En lugar de mapear clases, probablemente debería pensar primero en el esquema ... Thx1 – TruMan1

+0

Comencé un hilo por el enfoque totalmente opuesto a este dilema ... todavía no estoy seguro de si debería mapear primero las clases o la base de datos: http: // stackoverflow.com/questions/4724465/how-to-map-json-to-sql-schema – TruMan1

2

Si no tienen la libertad de utilizar dinámico tipos de .NET 4 o si desea aprovechar los beneficios que proporciona el tipado estático, el proyecto JSON Class Generator en codeplex generará clases C# con una cadena de entrada json. (plug descarado) También he tomado el código de este proyecto y slapped a web UI on it.

+0

¿Existe alguna posibilidad de que pueda lanzar una casilla de verificación para que sea 'UpperCamelCase'? (descarada pregunte) – Rippo